您好,我是湘王,這是我的博客園,歡迎您來,歡迎您再來~
除了可以通過ThreadPoolExecutor自定義執行緒池外,同Stream API中的Collectors一樣,多執行緒里的Executors類也提供了一組相關的執行緒池工具,可以直接拿來用,不用考慮用什么佇列合適的問題,
Javac除了傳統的四大執行緒池工具:
1、newFixedThreadPool定長執行緒池
2、newCachedThreadPool快取執行緒池
3、newSingleThreadExecutor單執行緒執行緒池
4、newScheduledThreadPool任務調度執行緒池
還包括了Java8新增的newWorkStealingPool搶占式執行緒池,目前這個用的不多,還是以之前的四大類執行緒池為主,
newFixedThreadPool定長執行緒池,顧名思義,就是它的執行緒池的大小是固定的,好比一個水池只能裝10個立方的水量,11個立方肯定就裝不下了,在newFixedThreadPool定長執行緒池中,c=m(也就是corePoolSize = maximumPoolSize),默認為無界佇列,用代碼來示例:
// 定長執行緒池 ExecutorService service1 = Executors.newFixedThreadPool(3); for (int i = 0; i < 10; i++) { System.out.println("創建執行緒 " + i); service1.execute(() -> System.out.println("當前執行緒 " + Thread.currentThread().getName())); } service1.shutdown();
可以看到,雖然創建了10個執行緒,但始終只有3個在作業,定長執行緒池在實際中用的比較多,尤其是一些可估算作業量的任務時,它的程式流程圖是這樣的:

newCachedThreadPool快取執行緒池不會限制池中的執行緒數量,可以無限往里增加,直到執行緒數量超出最大整數范圍,一般不會用這種方式,因為可能會因為程式故障而把機器拖垮,代碼也很簡單:
// 快取執行緒池 ExecutorService service2 = Executors.newCachedThreadPool(); for (int i = 0; i < 1_000_000_000; i++) { System.out.println("創建執行緒 " + i); service2.execute(() -> System.out.println("當前執行緒 " + Thread.currentThread().getName())); } service2.shutdown();
我希望創造10億個執行緒,計算機照單全收,我花了很長時間,它都沒有停下來的意思-_-!
所以我只好強制讓它休息了,

它的程式流程圖是這樣的:

newSingleThreadExecutor單執行緒執行緒池是定長執行緒池的一個特例,它的執行緒池長度始終為1,也就是c=m=1,它的代碼:
// 單執行緒執行緒池 ExecutorService service3 = Executors.newSingleThreadExecutor(); for (int i = 0; i < 10; i++) { System.out.println("創建執行緒 " + i); service3.execute(() -> System.out.println("當前執行緒 " + Thread.currentThread().getName())); } service3.shutdown();
執行后可以看到,它始終只能創建一個執行緒,
最后一個是任務調度執行緒池,顧名思義,需要執行某些任務調度時可以用到,例如:3個執行緒每秒執行1次的(僅執行1次):
// 任務調度執行緒池 ScheduledExecutorService service4 = Executors.newScheduledThreadPool(3); for (int i = 0; i < 10; i++) { // 延遲1秒后執行,僅執行1次 service4.schedule(() -> System.out.println("當前執行緒 " + Thread.currentThread().getName()), 1, TimeUnit.SECONDS); } service4.shutdown();
或者3個執行緒每3秒各執行1次的:
// 任務調度執行緒池 ScheduledExecutorService service5 = Executors.newScheduledThreadPool(3); for (int i = 0; i < 10; i++) { // 延遲1秒后執行,每3秒執行1次 service4.scheduleAtFixedRate(() -> System.out.println("當前執行緒 " + Thread.currentThread().getName()), 1, 3, TimeUnit.SECONDS); } service5.shutdown();
執行緒池的基本內容其實并不多,主要還是要在日常開發中實際使用,多用多練才能熟能生巧,
感謝您的大駕光臨!咨詢技術、產品、運營和管理相關問題,請關注后留言,歡迎騷擾,不勝榮幸~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/519274.html
標籤:其他
下一篇:HashMap詳解
