--------- android培訓、java培訓、期待與您交流!----------
此博文轉自:http://www.cnblogs.com/jersey/archive/2011/03/30/2000231.html
1、Java線程池學習:
Reference:
[3]《Java線程池學習》
[5]《線程池ThreadPoolExecutor使用簡介》
Introduce:
[1]中博主自己通過ThreadGroup實現一個線程池(挺方便理解的),使用的是jdk1.4版本Jdk1.5版本以上提供了現成的線程池。
[2]中介紹了java.util.concurrent.Executors類的API。
[3]中介紹了Java中線程池的類體系結構。
[4]中有ThreadPoolExecutor的實例應用。
[5]中有線程池的實例講解,實現了一個基於線程池的端口監聽服務器。
[6]中有對源碼比較細緻的分析,而且排版不錯。
2、Java裏面線程池的頂級接口是Executor,但是嚴格意義上講Executor並不是一個線程池,而只是一個執行線程的工具。真正的線程池接口是ExecutorService。下面這張圖完整描述了線程池的類體系結構。
3、標記一下比較重要的類:
ExecutorService:真正的線程池接口。
ScheduledExecutorService:能和Timer/TimerTask類似,解決那些需要任務重複執行的問題。
ThreadPoolExecutor:ExecutorService的默認實現。
ScheduledThreadPoolExecutor:繼承ThreadPoolExecutor的ScheduledExecutorService接口實
現,週期性任務調度的類實現。
4、要配置一個線程池是比較複雜的,尤其是對於線程池的原理不是很清楚的情況下,很有可能配置的線程池不是較優的,因此在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.固定大小的線程池:
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 { @Override public void run() { System.out.println(Thread.currentThread().getName() + "正在執行。。。"); } }
2.單任務線程池:
//創建一個使用單個 worker 線程的 Executor,以***隊列方式來運行該線程。 ExecutorService pool = Executors.newSingleThreadExecutor();
對於以上兩種連接池,大小都是固定的,當要加入的池的線程(或者任務)超過池最大尺寸時候,則入此線程池需要排隊等待。一旦池中有線程完畢,則排隊等待的某個線程會入池執行。
[2]中還介紹了:3.可變尺寸的線程池newChahedThreadPool;4.延遲連接池;5.單任務延遲連接池;6.自定義線程池