java 線程池對象ThreadPoolExecutor


ThreadPoolExecutor 介紹:

  java 提供的線程池類;

ThreadPoolExecutor 作用:

  兩個作用:

  1,用於分離執行任務和當前線程;

  2,主要設計初衷:重復利用Thread 對象;

ThreadPoolExecutor 使用:

   實例化:

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }

  這是ThreadPoolExecutor的構造方法之一,傳入參數最少,以下是參數說明:

  corePoolSize  : 設置線程池的線程核心數量;該參數作用:當向線程池中添加的任務數量小於核心數量時,線程池將優先創建新的線程,而不是重用之前已存在的線程(不管該線程可用與否);

  源碼佐證,ThreadPoolExecutor 的 execute(Runnable) 方法中有源碼如下:

  maximumPoolSize : 設置線程池可創建最大線程數量;該參數作用:用於限制線程池無限制的創建線程;

  源碼佐證,ThreadPoolExecutor 的 addWorker(Runnable ,boolean) 方法中有源碼如下:

  keepAliveTime  : 設置線程池被創建線程的存活時間;

  源碼佐證,ThreadPoolExecutor 的 getTask()方法中有源碼如下;源碼說明:創建的線程將從任務隊列中獲取一個新的任務,在keepAliveTime時間之后如果還未獲取到任務,將關閉該線程;

 

  unit :設置線程池線程存活時間的時間單位;

  workQueue :設置線程池用於存放任務的隊列;

  注意:ThreadPoolExecutor線程池是否創建新的線程不僅僅依賴於corePoolSize變量,還依賴於任務隊列的offer(E) 方法所返回的值;比如:想要創建一個cache線程池,就依賴於一個特殊的任務隊列:SynchronousQueue<E>;

   源碼佐證,ThreadPoolExecutor 的execute(Runnable) 方法中有源碼如下:

  示例: 創建固定線程池 和 cache線程池;

  固定線程池,將corePoolSize 和 maximumPoolSize 設置相同即可,在Executors.newFixedThreadPool(10)有源碼示例:

    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

  cacahe線程池,需要傳入特殊的BlockingQueue對象,該對象需要在offer是返回false,並能夠在poll方法中監聽到offer進入的任務;java 提供了一個SynchronousQueue類,該類就是這樣一個對象;在Executors.newCachedThreadPool()方法中,有源碼示例:

    public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }

  常用方法提示:

    void execute(Runnable command) : 任務提交方法;線程池將順序執行所提交的所有方法;

    void shutdown() : 停止后續任務提交,但執行完當前線程池中所有任務;該方法的作用:線程池將中斷當前所有空閑的線程,但不保證一定中斷(可查看Thread的interrupt方法);那么工作中的線程將繼續工作,直到完成;

    源碼:

    public void shutdown() {
        final ReentrantLock mainLock = this.mainLock;
        mainLock.lock();
        try {
            checkShutdownAccess();
            advanceRunState(SHUTDOWN);
            interruptIdleWorkers();    、//中斷所有空閑的線程
            onShutdown(); // hook for ScheduledThreadPoolExecutor
        } finally {
            mainLock.unlock();
        }
        tryTerminate();
    }

    List<Runnable> shutdownNow() : 立即終止線程池;該方法的作用:線程池將中斷所有創建的線程,但不保存一定中斷;線程池將所有剩余的任務從任務隊列中移除,不在執行,並保存在一個List中返回給用於;

    方法源碼:

 public List<Runnable> shutdownNow() {
        List<Runnable> tasks;
        final ReentrantLock mainLock = this.mainLock;
        mainLock.lock();
        try {
            checkShutdownAccess();
            advanceRunState(STOP);
            interruptWorkers();
            tasks = drainQueue();
        } finally {
            mainLock.unlock();
        }
        tryTerminate();
        return tasks;
    }

ThreadPoolExecutor 任務執行流程圖:

  

ThreadPoolExecutor 使用注意點說明:

  清晰需要使用的是那種類型的線程池,在實例化ThreadPoolExecutor時,傳入的參數不同創建出來的線程池也將不同;尤其注意傳入BlockingQueue參數,如果需要使用cache線程池,請確保BlockingQueue的offer方法反回false;可以參見SynchronousQueue類;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM