Java 執行緒池學習
Reference: 《建立Java執行緒池》[1],《Java執行緒:新特徵-執行緒池》[2], 《Java執行緒池學習》[3],《執行緒池ThreadPoolExecutor使用簡介》[4],《Java5中的執行緒池例項講解》[5],《ThreadPoolExecutor使用和思考》[6]
[1]中博主自己透過ThreadGroup實現一個執行緒池(挺方便理解的),使用的是jdk1.4版本,Jdk1.5版本以上提供了現成的執行緒池。
[2]中介紹了java.util.concurrent.Executors類的API。
[3]中介紹了Java中執行緒池的類體系結構。
[4]中有ThreadPoolExecutor的例項應用。
[5]中有執行緒池的例項講解,實現了一個基於執行緒池的埠監聽伺服器。★
[6]中有對原始碼比較細緻的分析,而且排版不錯( ^_^ )
Java裡面執行緒池的頂級介面是Executor,但是嚴格意義上講Executor並不是一個執行緒池,而只是一個執行執行緒的工具。真正的執行緒池介面是ExecutorService。下面這張圖完整描述了執行緒池的類體系結構。
標記一下比較重要的類:
ExecutorService: | 真正的執行緒池介面。 |
ScheduledExecutorService | 能和Timer/TimerTask類似,解決那些需要任務重複執行的問題。 |
ThreadPoolExecutor | ExecutorService的預設實現。 |
ScheduledThreadPoolExecutor | 繼承ThreadPoolExecutor的ScheduledExecutorService介面實現,週期性任務排程的類實現。 |
要配置一個執行緒池是比較複雜的,尤其是對於執行緒池的原理不是很清楚的情況下,很有可能配置的執行緒池不是較優的,因此在Executors類裡面提供了一些靜態工廠,生成一些常用的執行緒池。
- newSingleThreadExecutor:建立一個單執行緒的執行緒池。這個執行緒池只有一個執行緒在工作,也就是相當於單執行緒序列執行所有任務。如果這個唯一的執行緒因為異常結束,那麼會有一個新的執行緒來替代它。此執行緒池保證所有任務的執行順序按照任務的提交順序執行。
- newFixedThreadPool:建立固定大小的執行緒池。每次提交一個任務就建立一個執行緒,直到執行緒達到執行緒池的最大大小。執行緒池的大小一旦達到最大值就會保持不變,如果某個執行緒因為執行異常而結束,那麼執行緒池會補充一個新執行緒。
- newCachedThreadPool:建立一個可快取的執行緒池。如果執行緒池的大小超過了處理任務所需要的執行緒,那麼就會回收部分空閒(60秒不執行任務)的執行緒,當任務數增加時,此執行緒池又可以智慧的新增新執行緒來處理任務。此執行緒池不會對執行緒池大小做限制,執行緒池大小完全依賴於作業系統(或者說JVM)能夠建立的最大執行緒大小。
- newScheduledThreadPool:建立一個大小無限的執行緒池。此執行緒池支援定時以及週期性執行任務的需求。
- newSingleThreadExecutor:建立一個單執行緒的執行緒池。此執行緒池支援定時以及週期性執行任務的需求。
那我個人感覺就是new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEPALIVE_TIME, TIME_UNIT, workQueue, rejectedExecutionHandler);提供了更定製化的執行緒池製造方法。因為newFixedThreadPool方法其實也是return new ThreadPoolExecutor
java.util.concurrent.Executors類的API提供大量建立連線池的靜態方法:
1.固定大小的執行緒池:
package BackStage;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
public class JavaThreadPool {public static void main(String[] args) {// 建立一個可重用固定執行緒數的執行緒池
ExecutorService pool = Executors.newFixedThreadPool(2);// 建立實現了Runnable介面物件,Thread物件當然也實現了Runnable介面
Thread t1 = new MyThread();
Thread t2 = new MyThread();
Thread t3 = new MyThread();
Thread t4 = new MyThread();
Thread t5 = new MyThread();
// 將執行緒放入池中進行執行
pool.execute(t1);pool.execute(t2);pool.execute(t3);pool.execute(t4);pool.execute(t5);// 關閉執行緒池
pool.shutdown();}}class MyThread extends Thread {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "正在執行。。。");
}}
2.單任務執行緒池:
//建立一個使用單個 worker 執行緒的 Executor,以無界佇列方式來執行該執行緒。
ExecutorService pool = Executors.newSingleThreadExecutor();
對於以上兩種連線池,大小都是固定的,當要加入的池的執行緒(或者任務)超過池最大尺寸時候,則入此執行緒池需要排隊等待。一旦池中有執行緒完畢,則排隊等待的某個執行緒會入池執行。
[2]中還介紹了:3.可變尺寸的執行緒池newChahedThreadPool;4.延遲連線池;5.單任務延遲連線池;6.自定義執行緒池
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/143526/viewspace-1059055/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【java學習】ThreadPoolExecutor 執行緒池Javathread執行緒
- 執行緒池學習執行緒
- Java多執行緒學習(八)執行緒池與Executor 框架Java執行緒框架
- java學習筆記.04——執行緒池Java筆記執行緒
- 從使用到原理學習Java執行緒池Java執行緒
- Java執行緒池二:執行緒池原理Java執行緒
- 深入學習執行緒池原理執行緒
- python 學習--執行緒池Python執行緒
- Java多執行緒——執行緒池Java執行緒
- Java執行緒池Java執行緒
- java 執行緒池Java執行緒
- java執行緒池趣味事:這不是執行緒池Java執行緒
- java多執行緒9:執行緒池Java執行緒
- Java多執行緒18:執行緒池Java執行緒
- java 執行緒學習Java執行緒
- java執行緒學習Java執行緒
- 搞懂Java執行緒池Java執行緒
- Java Executors(執行緒池)Java執行緒
- Java執行緒池(Executor)Java執行緒
- 手寫執行緒池,對照學習ThreadPoolExecutor執行緒池實現原理!執行緒thread
- Java多執行緒-執行緒池的使用Java執行緒
- Java執行緒池一:執行緒基礎Java執行緒
- 【Java】【多執行緒】執行緒池簡述Java執行緒
- java多執行緒系列之執行緒池Java執行緒
- Java多執行緒學習——執行緒通訊Java執行緒
- Java多執行緒學習(2)執行緒控制Java執行緒
- Java 執行緒池執行原理分析Java執行緒
- Java併發程式設計學習筆記----執行緒池Java程式設計筆記執行緒
- 物聯網學習教程——執行緒池執行緒
- Java多執行緒學習Java執行緒
- java--執行緒池--建立執行緒池的幾種方式與執行緒池操作詳解Java執行緒
- C#多執行緒學習(四) 多執行緒的自動管理(執行緒池)C#執行緒
- C# 多執行緒學習(4) :多執行緒的自動管理(執行緒池)C#執行緒
- Android執行緒篇(二)Java執行緒池Android執行緒Java
- Java春招面試複習:執行緒池解析Java面試執行緒
- Java多執行緒學習(一)Java多執行緒入門Java執行緒
- #大學#Java多執行緒學習02(執行緒同步)Java執行緒
- 速讀Java執行緒池Java執行緒