最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

源碼分析Java中ThreadPoolExecutor的底層原理

 更新時間:2023年05月07日 09:06:24   作者:向豬羊  
這篇文章主要帶大家從源碼分析一下Java中ThreadPoolExecutor的底層原理,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,需要的可以參考一下

一、根據(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();
        }
    }
}

在運(yùn)行過程中可以發(fā)現(xiàn)3者速度有所差別,當(dāng)然3者的速度要根據(jù)實際處理自行判別,此處只以此代碼業(yè)務(wù)為例。

二、3種方式源碼分析

1、Executors.newCachedThreadPool()

源碼參數(shù)為:

0, 
Integer.MAX_VALUE,
60L, 
TimeUnit.SECONDS,
new SynchronousQueue<Runnable>()

以下圖中的外包公司為例(結(jié)合圖觀看),corePoolSize為0,即核心員工數(shù)為0;maximumPoolSize為Integer.MAX_VALUE,即非核心員工數(shù)為2的31次方-1;且BlockingQueue為同步隊列。當(dāng)任務(wù)進(jìn)來后分配給隊列,通過隊列分配給非核心員工,下一個任務(wù)再進(jìn)入隊列,以此循環(huán)執(zhí)行,直到任務(wù)執(zhí)行完成或者非核心員工都沒有空閑時,執(zhí)行拒絕策略。

2、Executors.newFixedThreadPool(10)

源碼參數(shù)為:

nThreads, 
nThreads,
0L, 
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()

以下圖中的外包公司為例(結(jié)合圖觀看),corePoolSize為10,即核心員工數(shù)為10;maximumPoolSize為10,即無非核心員工,且BlockingQueue為鏈表隊列,鏈表隊列最大數(shù)為2的31次方-1,若到達(dá)最大值后執(zhí)行拒絕策略。當(dāng)任務(wù)進(jìn)來后分配10個任務(wù)給10個核心員工,其余任務(wù)進(jìn)入鏈表隊列,當(dāng)核心員工有空閑時將鏈表隊列中的某任務(wù)給與空閑員工。以此循環(huán)執(zhí)行。

3、Executors.newSingleThreadExecutor()

源碼參數(shù)為:

1, 
1,
0L, 
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()

以下圖中的外包公司為例(結(jié)合圖觀看),corePoolSize為1,即核心員工數(shù)為1;maximumPoolSize為1,即無非核心員工,且BlockingQueue為鏈表隊列,鏈表隊列最大數(shù)為2的31次方-1,若到達(dá)最大值后執(zhí)行拒絕策略。當(dāng)任務(wù)進(jìn)來后分配1個任務(wù)給1個核心員工,其余任務(wù)進(jìn)入鏈表隊列,當(dāng)核心員工有空閑時將鏈表隊列中的某任務(wù)給與空閑員工。以此循環(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));
        }
    }
}

運(yùn)行結(jié)果如圖:

當(dāng)線程執(zhí)行到任務(wù)30時將會報出異常,為什么下面還會繼續(xù)執(zhí)行任務(wù)11-20呢?

其實這與提交優(yōu)先級、執(zhí)行優(yōu)先級有關(guān)

提交優(yōu)先級

在執(zhí)行任務(wù)1-10是會將任務(wù)直接給核心員工,當(dāng)任務(wù)11-20進(jìn)來后會分配到隊列等待,此時任務(wù)21-30進(jìn)來后發(fā)現(xiàn)隊列與核心員工中都存在任務(wù),會將其分配給非核心員工執(zhí)行。當(dāng)40以后的任務(wù)進(jìn)來后,由于沒有空閑人員,將會拋出異常。

執(zhí)行優(yōu)先級

在執(zhí)行任務(wù)1-10是會將任務(wù)直接給核心員工,任務(wù)11-20進(jìn)來后會分配給非核心員工執(zhí)行,當(dāng)任務(wù)21-30進(jìn)來后會分配到隊列等待。當(dāng)40以后的任務(wù)進(jìn)來后,由于沒有空閑人員,將會拋出異常。

以上就是源碼分析Java中ThreadPoolExecutor的底層原理的詳細(xì)內(nèi)容,更多關(guān)于Java ThreadPoolExecutor的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java自帶命令行工具jmap、jhat與jinfo的使用實例代碼詳解

    java自帶命令行工具jmap、jhat與jinfo的使用實例代碼詳解

    本篇文章主要通過代碼實例對java自帶命令行工具jmap、jhat與jinfo的使用做出了詳解,需要的朋友可以參考下
    2017-04-04
  • Java加速讀取復(fù)制超大文件

    Java加速讀取復(fù)制超大文件

    這篇文章主要為大家詳細(xì)介紹了Java加速讀取復(fù)制超大文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • maven?傳遞依賴的實現(xiàn)

    maven?傳遞依賴的實現(xiàn)

    本文主要介紹了Maven中傳遞依賴的處理方式,如scope=compile影響依賴傳遞,使用排除不需要的依賴,以及如何通過查看依賴樹解決運(yùn)行時錯誤,特別是在依賴排除后可能導(dǎo)致的運(yùn)行時缺少必需包的問題,感興趣的可以了解一下
    2024-10-10
  • java實現(xiàn)在一張大圖片上添加小圖及文字

    java實現(xiàn)在一張大圖片上添加小圖及文字

    這篇文章主要介紹了java實現(xiàn)在一張大圖上添加小圖及文字,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • redis?redisTemplate數(shù)據(jù)類型基礎(chǔ)操作

    redis?redisTemplate數(shù)據(jù)類型基礎(chǔ)操作

    這篇文章主要介紹了redis?redisTemplate數(shù)據(jù)類型基礎(chǔ)操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • java中"==" 與equals方法的使用

    java中"==" 與equals方法的使用

    本篇文章介紹了,在java中"==" 與equals方法的使用。需要的朋友參考下
    2013-04-04
  • 淺談IDEA中Maven配置問題全解決

    淺談IDEA中Maven配置問題全解決

    這篇文章主要介紹了淺談IDEA中Maven配置問題全解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Linux 下通過 java 命令啟動 jar 包常見方式小結(jié)

    Linux 下通過 java 命令啟動 jar 包常見方式小結(jié)

    這篇文章主要介紹了Linux 下通過 java 命令啟動 jar 包常見方式小結(jié),后臺啟動jar包命令大致有五種,每種方式結(jié)合代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2023-12-12
  • mybatis實現(xiàn)增刪改查_動力節(jié)點Java學(xué)院整理

    mybatis實現(xiàn)增刪改查_動力節(jié)點Java學(xué)院整理

    本文通過實例代碼給大家介紹了mybatis實現(xiàn)增刪改查功能,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-09-09
  • CountDownLatch基于AQS阻塞工具用法詳解

    CountDownLatch基于AQS阻塞工具用法詳解

    這篇文章主要為大家介紹了CountDownLatch基于AQS阻塞工具用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06

最新評論

西和县| 读书| 旌德县| 湖口县| 博乐市| 民权县| 达州市| 临夏市| 敦化市| 那坡县| 周至县| 南平市| 荆州市| 平果县| 工布江达县| 布尔津县| 保山市| 合江县| 申扎县| 合江县| 清流县| 蓝田县| 曲阳县| 曲阜市| 西盟| 梁山县| 连平县| 达尔| 平江县| 乡宁县| 海宁市| 株洲市| 彭水| 襄汾县| 阜南县| 资溪县| 普定县| 绿春县| 梁河县| 鄢陵县| 凤台县|