標籤:exe 任務 run 1.5 locking 介紹 ret 緩衝 new
參考文獻: http://www.jianshu.com/p/87bff5cc8d8c
http://www.jianshu.com/p/edd7cb4eafa0
在Java應用中如果需要頻繁的去建立大量線程去完成任務,肯定會對效能有很大的影響。因為系統在建立和銷毀線程上需要消耗太多的資源,開銷很大。
所以在這種情況下可以考慮線程池。有以下優點:
1) 降低資源消耗 :通過重複利用已建立的線程降低線程建立和銷毀造成的消耗;
2)提高響應速度 : 當任務到達時,任務可以不需要等到線程建立就能立即執行;
3)提高線程的可管理型: 線程是稀缺資源,如果無限制的建立,不僅會消耗系統資源,還會降低系統的穩定性,使用線程池可以進行統一的分配,調優和監控
在Java1.5中引入的Executor架構中定義了四種建立線程池的方法:
一、newFixedThreadPool
private static Executor executor = Executors.newFixedThreadPool(10);
固定型線程池,和newCacheThreadPool()差不多,也能夠實現resue(複用),但是這個池子規定了線程的最大數量,也就是說當池子有空閑時,那麼新的任務將會在空閑線程中被執行,一旦線程池內的線程都在進行工作,那麼新的任務就必須等待線程池有閒置時候才能夠進入線程池,其他的任務繼續排隊等待.這類池子沒有規定其閒置時間到底有多長.這一類的池子更適用於伺服器
二、newCachedThreadPool
private static Executor executor1 = Executors.newCachedThreadPool();
緩衝線程池,先查看線程池中是否有當前執行線程的緩衝,如果有就resue(複用),如果沒有,那麼需要建立一個線程來完成當前的調用.並且這類線程池只能完成一些生存期很短的一些任務.並且這類線程池內部規定能resue(複用)的線程,閒置時間不能超過60s,一旦超過了60s,就會被移出線程池
三、newSingleThreadExecutor
private static Executor executor2 = Executors.newSingleThreadExecutor();
初始化的線程池中只有一個線程,如果該線程異常結束,會重新建立一個新的線程繼續執行任務,唯一的線程可以保證所提交任務的順序執行,內部使用LinkedBlockingQueue作為阻塞隊列。
四、newScheduledThreadPool
private static Executor executor3 = Executors.newScheduledThreadPool(10);
調度型線程池,調度型線程池會根據Scheduled(工作清單)進行順延強制,或者是進行周期性的執行.適用於一些周期性的工作.
建立完任務後需要提交運行,線上程池架構中提供了兩種提交方法:
一、Executor.execute()
通過execute方法提交的參數必須要實現Runnable介面,任務在run方法中執行,該種方法提交的任務沒有傳回值。
//無傳回值 static class Task implements Runnable{ @Override public void run(){ System.out.print(Thread.currentThread().getName()); } }
二、ExecutorService.submit()
通過submit方法提交的參數中需要實現Callable介面,任務在call方法中執行,該種方法有傳回值,可以通過傳回值來判斷任務的執行狀態。
//有傳回值 static class callTask implements Callable<String>{ @Override public String call(){ return (Thread.currentThread().getName()); } }
java 的線程池介紹