自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
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- public class ThreadPoolTest {
- public static void main(String[] args) {
- ExecutorService threadPool = Executors.newFixedThreadPool(3);
- for(int i = 1; i < 5; i++) {
- final int taskID = i;
- threadPool.execute(new Runnable() {
- public void 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方法。
輸出結果:
- 第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方法。
輸出結果:
- 第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
- import java.util.concurrent.ScheduledExecutorService;
- import java.util.concurrent.TimeUnit;
- public class ThreadPoolTest {
- public static void main(String[] args) {
- ScheduledExecutorService schedulePool = Executors.newScheduledThreadPool(1);
- // 5秒後執行任務
- schedulePool.schedule(new Runnable() {
- public void run() {
- System.out.println("爆炸");
- }
- }, 5, TimeUnit.SECONDS);
- // 5秒後執行任務,以後每2秒執行一次
- schedulePool.scheduleAtFixedRate(new Runnable() {
- @Override
- public void run() {
- System.out.println("爆炸");
- }
- }, 5, 2, TimeUnit.SECONDS);
- }
- }
Java的併發包很強大,上面所說只是入門,隨着學習深入,會有更多記錄在博客裏