欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、根據(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ù)實(shí)際處理自行判別,此處只以此代碼業(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為同步隊(duì)列。當(dāng)任務(wù)進(jìn)來后分配給隊(duì)列,通過隊(duì)列分配給非核心員工,下一個(gè)任務(wù)再進(jìn)入隊(duì)列,以此循環(huán)執(zhí)行,直到任務(wù)執(zhí)行完成或者非核心員工都沒有空閑時(shí),執(zhí)行拒絕策略。

2、Executors.newFixedThreadPool(10)

源碼參數(shù)為:

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

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

3、Executors.newSingleThreadExecutor()

源碼參數(shù)為:

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

以下圖中的外包公司為例(結(jié)合圖觀看),corePoolSize為1,即核心員工數(shù)為1;maximumPoolSize為1,即無非核心員工,且BlockingQueue為鏈表隊(duì)列,鏈表隊(duì)列最大數(shù)為2的31次方-1,若到達(dá)最大值后執(zhí)行拒絕策略。當(dāng)任務(wù)進(jìn)來后分配1個(gè)任務(wù)給1個(gè)核心員工,其余任務(wù)進(jìn)入鏈表隊(duì)列,當(dāng)核心員工有空閑時(shí)將鏈表隊(duì)列中的某任務(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時(shí)將會(huì)報(bào)出異常,為什么下面還會(huì)繼續(xù)執(zhí)行任務(wù)11-20呢?

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

提交優(yōu)先級(jí)

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

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

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

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

相關(guān)文章

  • java代碼效率優(yōu)化方法(推薦)

    java代碼效率優(yōu)化方法(推薦)

    下面小編就為大家?guī)硪黄猨ava代碼效率優(yōu)化方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • Jmeter?BeanShell?內(nèi)置變量vars、props、prev的使用詳解

    Jmeter?BeanShell?內(nèi)置變量vars、props、prev的使用詳解

    這篇文章主要介紹了Jmeter?BeanShell?內(nèi)置變量vars、props、prev的使用?,文中給大家介紹了Jmeter中關(guān)于BeanShell的相關(guān)知識(shí),結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • 實(shí)例解析如何正確使用Java數(shù)組

    實(shí)例解析如何正確使用Java數(shù)組

    同一種類型數(shù)據(jù)的集合。其實(shí)數(shù)組就是一個(gè)容器。運(yùn)算的時(shí)候有很多數(shù)據(jù)參與運(yùn)算,那么首先需要做的是什么下面我們就一起來看看。
    2016-07-07
  • java如何讀取某個(gè)文件夾中的全部文件(包括子文件夾)

    java如何讀取某個(gè)文件夾中的全部文件(包括子文件夾)

    這篇文章主要介紹了java如何讀取某個(gè)文件夾中的全部文件(包括子文件夾),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • springmvc學(xué)習(xí)筆記-返回json的日期格式問題的解決方法

    springmvc學(xué)習(xí)筆記-返回json的日期格式問題的解決方法

    本篇文章主要介紹了springmvc學(xué)習(xí)筆記-返回json的日期格式問題的解決方法,解決了日期格式的輸出,有興趣的可以了解一下。
    2017-01-01
  • SpringBoot+Redis海量重復(fù)提交問題解決

    SpringBoot+Redis海量重復(fù)提交問題解決

    在實(shí)際的開發(fā)項(xiàng)目中,一個(gè)對(duì)外暴露的接口往往會(huì)面臨很多次請(qǐng)求,所以本文介紹一下SpringBoot+Redis海量重復(fù)提交問題解決,感興趣的可以了解一下
    2023-12-12
  • JAVA使用ElasticSearch查詢in和not in的實(shí)現(xiàn)方式

    JAVA使用ElasticSearch查詢in和not in的實(shí)現(xiàn)方式

    今天小編就為大家分享一篇關(guān)于JAVA使用Elasticsearch查詢in和not in的實(shí)現(xiàn)方式,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • SpringBoot如何使用mica-xss防止Xss攻擊

    SpringBoot如何使用mica-xss防止Xss攻擊

    這篇文章主要介紹了SpringBoot如何使用mica-xss防止Xss攻擊問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 基于Process#waitFor()阻塞問題的解決

    基于Process#waitFor()阻塞問題的解決

    這篇文章主要介紹了Process#waitFor()阻塞問題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(44)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(44)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07

最新評(píng)論