Java 線程池

線程的實現(xiàn)
  1. Thread
  2. Runnable
  3. Callable
什么時候使用線程池?
  1. 單任務(wù)處理時間比較短
  2. 需要處理的任務(wù)量大
線程池的優(yōu)勢
  1. 重用存在的線程,減少線程創(chuàng)建、銷毀的開銷,提高性能
  2. 提高響應(yīng)速度,任務(wù)可以使用線程池中空閑的線程,多任務(wù)同時執(zhí)行
  3. 提高線程的可管理性,對線程進行統(tǒng)一分配,監(jiān)控和調(diào)優(yōu)
線程池的狀態(tài)
  1. RUNNING 能夠接收任務(wù),對已添加的任務(wù)進行處理
  2. SHUTDOWN 不接收任務(wù),但還能處理已添加的任務(wù)
  3. STOP 不接收任務(wù),不處理已添加的任務(wù),而且中斷正在執(zhí)行的任務(wù)
  4. TIDYING 當所有任務(wù)都終止,如果想在 TIDYING 狀態(tài)時執(zhí)行某些東西,可以重寫 terminated() 函數(shù)
  5. TERMINATED 線程池終止
image.png
線程池的具體實現(xiàn)
  1. ThreaPoolExecutor 默認線程池
  2. ScheduledThreadPoolExecutor 定時線程池
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) 
                          
image.png
參數(shù)解析
  1. corePoolSize
    線程池中的核心線程數(shù),當提交一個任務(wù)時,線程池創(chuàng)建一個新線程執(zhí)行任務(wù),直到當前線程數(shù)等于 corePoolSize;如果當前線程數(shù)為 corePoolSize,繼續(xù)提交的任務(wù)被保存到阻塞隊列中,等待被執(zhí)行;如果執(zhí)行了線程池的 prestartAllCoreThreads() 方法,線程池會提前創(chuàng)建并啟動所有核心線程。

  2. maximumPoolSize
    線程池中允許的最大線程數(shù)。如果當前阻塞隊列滿了,且繼續(xù)提交任務(wù),則創(chuàng)建新的線程執(zhí)行任務(wù),前提是當前線程數(shù)小于maximumPoolSize

  3. keepAliveTime
    線程池維護線程所允許的空閑時間。當線程池中的線程數(shù)量大于 corePoolSize 的時候,如果這時沒有新的任務(wù)提交,核心線程外的線程不會立即銷毀,而是會等待,直到等待的時間超過了keepAliveTime;

  4. unit
    keepAliveTime的單位

  5. workQueue
    用來保存等待被執(zhí)行的任務(wù)的阻塞隊列,且任務(wù)必須實現(xiàn)Runable接口,在JDK中提供了如下阻塞隊列:
    (a)、ArrayBlockingQueue:基于數(shù)組結(jié)構(gòu)的有界阻塞隊列,按FIFO排序任務(wù);

    (b)、LinkedBlockingQuene:基于鏈表結(jié)構(gòu)的阻塞隊列,按FIFO排序任務(wù),吞吐量通常要高于ArrayBlockingQuene;

    (c)、SynchronousQuene:一個不存儲元素的阻塞隊列,每個插入操作必須等到另一個線程調(diào)用移除操作,否則插入操作一直處于阻塞狀態(tài),吞吐量通常要高于LinkedBlockingQuene;

    (d)、priorityBlockingQuene:具有優(yōu)先級的無界阻塞隊列;

  6. threadFactory
    它是ThreadFactory類型的變量,用來創(chuàng)建新線程。默認使用Executors.defaultThreadFactory() 來創(chuàng)建線程。使用默認的 ThreadFactory 來創(chuàng)建線程時,會使新創(chuàng)建的線程具有相同的 NORM_PRIORITY 優(yōu)先級并且是非守護線程,同時也設(shè)置了線程的名稱。

  7. handler
    線程池的飽和策略,當阻塞隊列滿了,且沒有空閑的工作線程,如果繼續(xù)提交任務(wù),必須采取一種策略處理該任務(wù),線程池提供了4種策略:
    (a)、AbortPolicy:直接拋出異常,默認策略;

    (b)、CallerRunsPolicy:用調(diào)用者所在的線程來執(zhí)行任務(wù);

    (c)、DiscardOldestPolicy:丟棄阻塞隊列中靠最前的任務(wù),并執(zhí)行當前任務(wù);

    (d)、DiscardPolicy:直接丟棄任務(wù);

    上面的4種策略都是 ThreadPoolExecutor 的內(nèi)部類。

    當然也可以根據(jù)應(yīng)用場景實現(xiàn) RejectedExecutionHandler 接口,自定義飽和策略,如記錄日志或持久化存儲不能處理的任務(wù)。

線程池監(jiān)控
public long getTaskCount() //線程池已執(zhí)行與未執(zhí)行的任務(wù)總數(shù)
public long getCompletedTaskCount() //已完成的任務(wù)數(shù)
public int getPoolSize() //線程池當前的線程數(shù)
public int getActiveCount() //線程池中正在執(zhí)行任務(wù)的線程數(shù)量
參考

Java線程池原理與源碼詳細解讀

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容