源碼分析Java中ThreadPoolExecutor的底層原理
一、根據(jù)代碼查看jdk提供的3種線程池創(chuàng)建
public class TestController { public static void main(String[] args) { ExecutorService executorService = Executors.newCachedThreadPool();//快 ExecutorService executorService1 = Executors.newFixedThreadPool(10);//慢 ExecutorService executorService2 = Executors.newSingleThreadExecutor();//很慢 for (int i = 0; i < 100; i++) { executorService.execute(new MyTask(i)); } } } class MyTask implements Runnable{ private int i; public MyTask(int i) { this.i = i; } @Override public void run() { System.out.println(Thread.currentThread()+"-"+i); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }
在運行過程中可以發(fā)現(xiàn)3者速度有所差別,當然3者的速度要根據(jù)實際處理自行判別,此處只以此代碼業(yè)務為例。
二、3種方式源碼分析
1、Executors.newCachedThreadPool()
源碼參數(shù)為:
0,
Integer.MAX_VALUE,
60L,
TimeUnit.SECONDS,
new SynchronousQueue<Runnable>()
以下圖中的外包公司為例(結合圖觀看),corePoolSize為0,即核心員工數(shù)為0;maximumPoolSize為Integer.MAX_VALUE,即非核心員工數(shù)為2的31次方-1;且BlockingQueue為同步隊列。當任務進來后分配給隊列,通過隊列分配給非核心員工,下一個任務再進入隊列,以此循環(huán)執(zhí)行,直到任務執(zhí)行完成或者非核心員工都沒有空閑時,執(zhí)行拒絕策略。
2、Executors.newFixedThreadPool(10)
源碼參數(shù)為:
nThreads,
nThreads,
0L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()
以下圖中的外包公司為例(結合圖觀看),corePoolSize為10,即核心員工數(shù)為10;maximumPoolSize為10,即無非核心員工,且BlockingQueue為鏈表隊列,鏈表隊列最大數(shù)為2的31次方-1,若到達最大值后執(zhí)行拒絕策略。當任務進來后分配10個任務給10個核心員工,其余任務進入鏈表隊列,當核心員工有空閑時將鏈表隊列中的某任務給與空閑員工。以此循環(huán)執(zhí)行。
3、Executors.newSingleThreadExecutor()
源碼參數(shù)為:
1,
1,
0L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()
以下圖中的外包公司為例(結合圖觀看),corePoolSize為1,即核心員工數(shù)為1;maximumPoolSize為1,即無非核心員工,且BlockingQueue為鏈表隊列,鏈表隊列最大數(shù)為2的31次方-1,若到達最大值后執(zhí)行拒絕策略。當任務進來后分配1個任務給1個核心員工,其余任務進入鏈表隊列,當核心員工有空閑時將鏈表隊列中的某任務給與空閑員工。以此循環(huán)執(zhí)行。
三、自定義方式執(zhí)行
public class TestController { public static void main(String[] args) { ExecutorService executorService = Executors.newCachedThreadPool();//快 ExecutorService executorService1 = Executors.newFixedThreadPool(10);//慢 ExecutorService executorService2 = Executors.newSingleThreadExecutor();//很慢 ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 20, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10)); for (int i = 0; i < 100; i++) { threadPoolExecutor.execute(new MyTask(i)); } } }
運行結果如圖:
當線程執(zhí)行到任務30時將會報出異常,為什么下面還會繼續(xù)執(zhí)行任務11-20呢?
其實這與提交優(yōu)先級、執(zhí)行優(yōu)先級有關
提交優(yōu)先級
在執(zhí)行任務1-10是會將任務直接給核心員工,當任務11-20進來后會分配到隊列等待,此時任務21-30進來后發(fā)現(xiàn)隊列與核心員工中都存在任務,會將其分配給非核心員工執(zhí)行。當40以后的任務進來后,由于沒有空閑人員,將會拋出異常。
執(zhí)行優(yōu)先級
在執(zhí)行任務1-10是會將任務直接給核心員工,任務11-20進來后會分配給非核心員工執(zhí)行,當任務21-30進來后會分配到隊列等待。當40以后的任務進來后,由于沒有空閑人員,將會拋出異常。
以上就是源碼分析Java中ThreadPoolExecutor的底層原理的詳細內(nèi)容,更多關于Java ThreadPoolExecutor的資料請關注腳本之家其它相關文章!
- Java線程池?ThreadPoolExecutor?詳解
- Java多線程ThreadPoolExecutor詳解
- Java線程池ThreadPoolExecutor源碼深入分析
- java高并發(fā)ThreadPoolExecutor類解析線程池執(zhí)行流程
- java高并發(fā)ScheduledThreadPoolExecutor與Timer區(qū)別
- 徹底搞懂java并發(fā)ThreadPoolExecutor使用
- Java多線程編程基石ThreadPoolExecutor示例詳解
- 一文搞懂Java的ThreadPoolExecutor原理
- 一文弄懂Java中ThreadPoolExecutor
相關文章
Jmeter?BeanShell?內(nèi)置變量vars、props、prev的使用詳解
這篇文章主要介紹了Jmeter?BeanShell?內(nèi)置變量vars、props、prev的使用?,文中給大家介紹了Jmeter中關于BeanShell的相關知識,結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2022-10-10springmvc學習筆記-返回json的日期格式問題的解決方法
本篇文章主要介紹了springmvc學習筆記-返回json的日期格式問題的解決方法,解決了日期格式的輸出,有興趣的可以了解一下。2017-01-01JAVA使用ElasticSearch查詢in和not in的實現(xiàn)方式
今天小編就為大家分享一篇關于JAVA使用Elasticsearch查詢in和not in的實現(xiàn)方式,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12