列舉Executors工具中幾種線程池的使用

1. 線程池的介紹:
   在開發中,頻繁的創建和銷燬一個線程,是很耗資源的,爲此找出了一個可以循環利用已經存在的線程來達到自己的目的,線程池顧名思義,也就是線程池的集合,通過線程池執行的線程任務,可以很有效的去規劃線程的使用。
   在java.util.concurrent併發包中大致有以下幾種常用的線程池:
      1.1 newScheduledThreadPool  創建一個定長線程池,支持定時及週期性任務執行。可以作一個定時器使用。
      1.2 newCachedThreadPool     創建一個可緩存線程池,如果線程池長度超過需要的線程數量,可靈活回收空閒線程,若無可回收,則新建線程。
      1.3 newSingleThreadExecutor 創建一個單線程化的線程池, 它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行,可以控制線程的執行順序
      1.4 newFixedThreadPool      創建一個定長線程池,可控制線程最大併發數,超出的線程會在隊列中等待,當創建的線程池數量爲1的時候。也類似於單線程化的線程池,當爲1的時候,也可控制線程的執行順序
      
public class ThreadPoolTest {

    /**
     * 測試newScheduledThreadPool 創建一個定長線程池,支持定時及週期性任務執行。
     * 一般可做定時器使用
     */
    public static void newScheduledThreadPoolTest(){
        //corePoolSize 參數是指線程池中核心線程的數量
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
        /**
         * initialDelay參數,是首次執行該線程的延遲時間
         * period參數,週期性執行業務邏輯的間隔時間
         */
        scheduledExecutorService.scheduleAtFixedRate(new Runnable() {

            @Override
            public void run() {
                //執行業務邏輯
                System.out.println(System.currentTimeMillis());

            }
        }, 10, 3, TimeUnit.SECONDS);
    }

    /**
     * newCachedThreadPool創建一個可緩存線程池,
     * 如果線程池長度超過處理需要,可靈活回收空閒線程,若無可回收,則新建線程。
     */
    public static void newCachedThreadPoolTest(){
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(i * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            int finalI = i;
            cachedThreadPool.execute(new Runnable() {
                @Override
                public void run() {
                    //執行業務邏輯
                    System.out.println(finalI + ":" + System.currentTimeMillis());
                }
            });
        }
    }

    /**
     * newSingleThreadExecutor 創建一個單線程化的線程池,
     * 它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行
     */
    public static void newSingleThreadExecutorTest(){
        ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
        for(int i = 0; i < 10; i++){
            final int index = i;
            singleThreadExecutor.execute(new Runnable() {
                @Override
                public void run() {
                    //執行業務邏輯
                    System.out.println(index);
                }
            });
        }
    }

    /**
     * newFixedThreadPool 創建一個定長線程池,可控制線程最大併發數,超出的線程會在隊列中等待
     */
    public static void newFixedThreadPoolTest(){
        //最多2個線程將處於活動狀態,如果提交了2個以上的線程,那麼它們將保持在隊列中,直到線程可用
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(2);
        for(int i = 0; i < 10; i++){
            final int index = i;
            fixedThreadPool.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        System.out.println(index);
                        Thread.sleep(2000);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }

    public static void main(String args[]){
//        ThreadPoolTest.newScheduledThreadPoolTest();
//        ThreadPoolTest.newCachedThreadPoolTest();
//          ThreadPoolTest.newSingleThreadExecutorTest();
          ThreadPoolTest.newFixedThreadPoolTest();
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章