幾種常見的線程池:

Java通過Executors提供四種線程池,分別爲:

  • newCachedThreadPool

創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閒線程,若無可回收,則新建線程。

  • newFixedThreadPool

創建一個定長線程池,可控制線程最大併發數,超出的線程會在隊列中等待。

  • newScheduledThreadPool

創建一個定長線程池,支持定時及週期性任務執行。

  • newSingleThreadExecutor

創建一個單線程化的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行。

 

newFixedThreadPool

//定長線程池
        ExecutorService threadPoolService = Executors.newFixedThreadPool(10);
        threadPoolService.execute(new Runnable() {
            @Override
            public void run() {
                Thread thread = Thread.currentThread();
                String name = thread.getName();
                System.out.println(name);
            }
        });

newScheduledThreadPool

        /**
         * 可支持定時任務的線程池
         *      下面的例子表示任務再3分鐘後執行
         */
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(100);
        scheduledThreadPool.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("test");
            }
        },3L,TimeUnit.MINUTES);

newSingleThreadExecutor

        /**
         * 創建單線程化的線程池,他只會用唯一的工作線程來執行任務,保證所有的任務按照順序來執行。
         */
        ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 10; i++) {
            final int index=i;
            singleThreadExecutor.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        System.out.println("testing..... index: "+index);
                        Thread.sleep(1000L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }

newCachedThreadPool

        /**
         * 可緩存的線程池
         *      查看源碼發現是,再我們使用完後,線程不會立刻銷燬,先緩存起來過了活躍時間後才銷燬
         */
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        cachedThreadPool.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("test...");
            }
        });

ThreadPoolExecutor :

在Java開發規範中,寫到這些線程的默認值過大,一般採用的是底層的線程池[ ThreadPoolExecutor ],來自己創建線程池,如下:

ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 100, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
        executor.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("testing...");
            }
        });
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章