Java執行緒(六):執行緒池
阿新 • • 發佈:2019-02-01
自JDK5之後,Java推出了一個併發包,java.util.concurrent,在Java開發中,我們接觸到了好多池的技術,String類的物件池、Integer的共享池、連線資料庫的連線池、Struts1.3的物件池等等,池的最終目的都是節約資源,以更小的開銷做更多的事情,從而提高效能。
我們的web專案都是部署在伺服器上,瀏覽器端的每一個request就是一個執行緒,那麼伺服器需要併發的處理多個請求,就需要執行緒池技術,下面來看一下Java併發包下如何建立執行緒池。
1. 建立一個可重用固定執行緒集合的執行緒池,以共享的無界佇列方式來執行這些執行緒。
- ExecutorService threadPool = Executors.newFixedThreadPool(3);// 建立可以容納3個執行緒的執行緒池
- ExecutorService threadPool = Executors.newCachedThreadPool();// 執行緒池的大小會根據執行的任務數動態分配
- ExecutorService threadPool = Executors.newSingleThreadExecutor();// 建立單個執行緒的執行緒池,如果當前執行緒在執行任務時突然中斷,則會建立一個新的執行緒替代它繼續執行任務
- ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(3);// 效果類似於Timer定時器
1. FixedThreadPool
[java] view plaincopyprint?- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- publicclass ThreadPoolTest {
- publicstaticvoid main(String[] args) {
- ExecutorService threadPool = Executors.newFixedThreadPool(3);
- for(int i = 1; i < 5; i++) {
- finalint taskID = i;
- threadPool.execute(new Runnable() {
- publicvoid run() {
- for(int i = 1; i < 5; i++) {
- try {
- Thread.sleep(20);// 為了測試出效果,讓每次任務執行都需要一定時間
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println("第" + taskID + "次任務的第" + i + "次執行");
- }
- }
- });
- }
- threadPool.shutdown();// 任務執行完畢,關閉執行緒池
- }
- }
- 第1次任務的第1次執行
- 第2次任務的第1次執行
- 第3次任務的第1次執行
- 第2次任務的第2次執行
- 第3次任務的第2次執行
- 第1次任務的第2次執行
- 第3次任務的第3次執行
- 第1次任務的第3次執行
- 第2次任務的第3次執行
- 第3次任務的第4次執行
- 第2次任務的第4次執行
- 第1次任務的第4次執行
- 第4次任務的第1次執行
- 第4次任務的第2次執行
- 第4次任務的第3次執行
- 第4次任務的第4次執行
2. CachedThreadPool
上段程式碼其它地方不變,將newFixedThreadPool方法換成newCachedThreadPool方法。
輸出結果:
[java] view plaincopyprint?- 第3次任務的第1次執行
- 第4次任務的第1次執行
- 第1次任務的第1次執行
- 第2次任務的第1次執行
- 第4次任務的第2次執行
- 第3次任務的第2次執行
- 第2次任務的第2次執行
- 第1次任務的第2次執行
- 第2次任務的第3次執行
- 第3次任務的第3次執行
- 第1次任務的第3次執行
- 第4次任務的第3次執行
- 第2次任務的第4次執行
- 第4次任務的第4次執行
- 第3次任務的第4次執行
- 第1次任務的第4次執行
3. SingleThreadExecutor
上段程式碼其它地方不變,將newFixedThreadPool方法換成newSingleThreadExecutor方法。
輸出結果:
[java] view plaincopyprint?- 第1次任務的第1次執行
- 第1次任務的第2次執行
- 第1次任務的第3次執行
- 第1次任務的第4次執行
- 第2次任務的第1次執行
- 第2次任務的第2次執行
- 第2次任務的第3次執行
- 第2次任務的第4次執行
- 第3次任務的第1次執行
- 第3次任務的第2次執行
- 第3次任務的第3次執行
- 第3次任務的第4次執行
- 第4次任務的第1次執行
- 第4次任務的第2次執行
- 第4次任務的第3次執行
- 第4次任務的第4次執行
4.ScheduledThreadPool
[java] view plaincopyprint?- import java.util.concurrent.ScheduledExecutorService;
- import java.util.concurrent.TimeUnit;
- publicclass ThreadPoolTest {
- publicstaticvoid main(String[] args) {
- ScheduledExecutorService schedulePool = Executors.newScheduledThreadPool(1);
- // 5秒後執行任務
- schedulePool.schedule(new Runnable() {
- publicvoid run() {
- System.out.println("爆炸");
- }
- }, 5, TimeUnit.SECONDS);
- // 5秒後執行任務,以後每2秒執行一次
- schedulePool.scheduleAtFixedRate(new Runnable() {
- @Override
- publicvoid run() {
- System.out.println("爆炸");
- }
- }, 5, 2, TimeUnit.SECONDS);
- }
- }
Java的併發包很強大,上面所說只是入門,隨著學習深入,會有更多記錄在部落格裡。