首頁 > Java > java教程 > Java 建立線程池的四種方式

Java 建立線程池的四種方式

Guanhui
發布: 2020-06-04 09:29:32
原創
5170 人瀏覽過

Java 建立線程池的四種方式

Java 建立執行緒池的四種方式

#1、newCachedThreadPool 建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒線程,若無可回收,則新線程。

2、newFixedThreadPool 建立一個定長執行緒池,可控制執行緒最大並發數,超出的執行緒會在佇列中等待。

3、newScheduledThreadPool 建立一個定長執行緒池,支援定時及週期性任務執行。

4、newSingleThreadExecutor 建立一個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務都按照指定順序(FIFO, LIFO, 優先權)執行。

newCachedThreadPool

建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒線程,

若無可回收,則新建執行緒。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

package cn.qbz.thread;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class Test111907 {

    public static void main(String[] args) {

        ExecutorService executorService = Executors.newCachedThreadPool();

        for (int i = 0; i < 10; i++) {

            final int temp = i;

            executorService.execute(new Runnable() {

                @Override

                public void run() {

                    try {

                        Thread.sleep(1000);

                    } catch (InterruptedException e) {

                        e.printStackTrace();

                    }

                    System.out.println(Thread.currentThread().getName() + "   i=" + temp);

                }

            });

        }

    }

}

    public static ExecutorService newCachedThreadPool() {

        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,

                                      60L, TimeUnit.SECONDS,

                                      new SynchronousQueue<Runnable>());

    }

登入後複製

newFixedThreadPool

建立一個定長執行緒池,可控制執行緒最大並發數,超出的執行緒會在佇列中等待。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

package cn.qbz.thread;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class Test111907 {

    public static void main(String[] args) {

        ExecutorService executorService = Executors.newFixedThreadPool(3);

        for (int i = 0; i < 10; i++) {

            final int temp = i;

            executorService.execute(new Runnable() {

                @Override

                public void run() {

                    try {

                        Thread.sleep(100);

                    } catch (InterruptedException e) {

                        e.printStackTrace();

                    }

                    System.out.println(Thread.currentThread().getName() + "   i=" + temp);

                }

            });

        }

    }

}

    public static ExecutorService newFixedThreadPool(int nThreads) {

        return new ThreadPoolExecutor(nThreads, nThreads,

                                      0L, TimeUnit.MILLISECONDS,

                                      new LinkedBlockingQueue<Runnable>());

    }

登入後複製

newScheduledThreadPool

建立一個定長執行緒池,支援定時及週期性任務執行。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

package cn.qbz.thread;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

public class Test111907 {

    public static void main(String[] args) {

        final long begin = System.currentTimeMillis();

        ExecutorService executorService = Executors.newScheduledThreadPool(3);

        for (int i = 0; i < 10; i++) {

            final int temp = i;

            final long time = begin;

            executorService.schedule(new Runnable() {

                @Override

                public void run() {

                    try {

                        Thread.sleep(100);

                    } catch (InterruptedException e) {

                        e.printStackTrace();

                    }

                    System.out.println(Thread.currentThread().getName() + "   i=" + temp + "   time=" + (System.currentTimeMillis() - time));

                }

            }, 5, TimeUnit.SECONDS);

        }

    }

}

    public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {

        return new ScheduledThreadPoolExecutor(corePoolSize);

    }

    public ScheduledThreadPoolExecutor(int corePoolSize) {

        super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS,

              new DelayedWorkQueue());

    }

登入後複製

newSingleThreadExecutor

建立一個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,

#保證所有任務依照指定順序(FIFO, LIFO, 優先權)執行。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

package cn.qbz.thread;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

public class Test111907 {

    public static void main(String[] args) {

        ExecutorService executorService = Executors.newSingleThreadExecutor();

        for (int i = 0; i < 10; i++) {

            final int temp = i;

            executorService.execute(new Runnable() {

                @Override

                public void run() {

                    try {

                        Thread.sleep(100);

                    } catch (InterruptedException e) {

                        e.printStackTrace();

                    }

                    System.out.println(Thread.currentThread().getName() + "   i=" + temp);

                }

            });

        }

    }

}

登入後複製

推薦教學:Java教學

#

以上是Java 建立線程池的四種方式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板