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

關(guān)于線程池你不得不知道的一些設(shè)置

 更新時間:2024年06月14日 14:27:41   作者:Java科代表  
這篇文章主要介紹了關(guān)于線程池你不得不知道的一些設(shè)置,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>

看完我上一篇文章,「你都理解創(chuàng)建線程池的參數(shù)嗎?」之后,當遇到這種問題,你覺得你完全能夠唬住面試官了,50k輕松到手。殊不知,要是面試官此刻給你來個反殺:

初始化線程池時可以預(yù)先創(chuàng)建線程嗎?線程池的核心線程可以被回收嗎?為什么?

如果此刻你一臉懵逼,這個要慌,問題很大,50k馬上變5k。

有細心的網(wǎng)友早就想到了這個問題:

在ThreadPoolExecutor線程池中,還有一些不常用的設(shè)置。我建議如果您在應(yīng)用場景中沒有特殊的要求,就不需要使用這些設(shè)置。

初始化線程池時可以預(yù)先創(chuàng)建線程嗎?

prestartAllCoreThreads

初始化線程池時是可以預(yù)先創(chuàng)建線程的,初始化線程池后,再調(diào)用prestartAllCoreThreads()方法,即可預(yù)先創(chuàng)建corePoolSize數(shù)量的核心線程,我們看源碼:

public int prestartAllCoreThreads() {
 int n = 0;
 while (addWorker(null, true))
  ++n;
 return n;
}
private boolean addWorker(Runnable firstTask, boolean core) {
 // ..
}

addWorker方法目的是在線程池中添加任務(wù)并執(zhí)行,如果task為空,線程獲取任務(wù)執(zhí)行時調(diào)用getTask()方法,該方法從blockingQueue阻塞隊列中阻塞獲取任務(wù)執(zhí)行,因此線程不會釋放,留存在線程池中,如果core=true,說明任務(wù)只能利用核心線程來執(zhí)行。

所以該方法會在線程池總預(yù)先創(chuàng)建沒有任務(wù)執(zhí)行的線程,數(shù)量為corePoolSize。

下面我們測試一下:

從測試結(jié)果來看,線程池中已經(jīng)預(yù)先創(chuàng)建了corePoolSize數(shù)量的空閑線程。

prestartCoreThread

prestartCoreThread()同樣可以預(yù)先創(chuàng)建線程,只不過該方法只會與創(chuàng)建1條線程,我們來看源碼:

public boolean prestartCoreThread() {
 return workerCountOf(ctl.get()) < corePoolSize &&
  addWorker(null, true);
}

 從方法源碼可知,如果此時工作線程數(shù)量小于corePoolSize,那么就調(diào)用addWorker創(chuàng)建1條空閑核心線程。

下面我們測試一下:

從測試結(jié)果來看,線程池中已經(jīng)預(yù)先創(chuàng)建了1條空閑線程。

線程池的核心線程可以被回收嗎?

你可能會想到將corePoolSize的數(shù)量設(shè)置為0,從而線程池的所有線程都是“臨時”的,只有keepAliveTime存活時間,你的思路也許時正確的,但你有沒有想過一個很嚴重的后果,corePoolSize=0時,任務(wù)需要填滿阻塞隊列才會創(chuàng)建線程來執(zhí)行任務(wù),阻塞隊列有設(shè)置長度還好,如果隊列長度無限大呢,你就等著OOM異常吧,所以用這種設(shè)置行為并不是我們所需要的。

有沒有什么設(shè)置可以回收核心線程呢?

allowCoreThreadTimeOut

ThreadPoolExecutor有一個私有成員變量:

private volatile boolean allowCoreThreadTimeOut;

 如果allowCoreThreadTimeOut=true,核心線程在規(guī)定時間內(nèi)會被回收。

上面我也說了,當線程空閑時會從blockingQueue阻塞隊列中阻塞獲取任務(wù)執(zhí)行,所以我們來看看是保證核心線程不被銷毀的,我們直接定位到源碼部位:

java.util.concurrent.ThreadPoolExecutor#getTask:

boolean timedOut = false; // Did the last poll() time out?
for (;;) {
 // Are workers subject to culling?
 boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;

 try {
  Runnable r = timed ?
   workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
  workQueue.take();
  if (r != null)
   return r;
  timedOut = true;
 } catch (InterruptedException retry) {
  timedOut = false;
 }
}

這里的關(guān)鍵值timed,如果allowCoreThreadTimeOut=true或者此時工作線程大于corePoolSize,timed=true,如果timed=true,會調(diào)用poll()方法從阻塞隊列中獲取任務(wù),否則調(diào)用take()方法獲取任務(wù)。

下面我來解釋這兩個方法:

  1. poll(long timeout, TimeUnit unit):從BlockingQueue取出一個任務(wù),如果不能立即取出,則可以等待timeout參數(shù)的時間,如果超過這個時間還不能取出任務(wù),則返回null;
  2. take():從blocking阻塞隊列取出一個任務(wù),如果BlockingQueue為空,阻斷進入等待狀態(tài)直到BlockingQueue有新的任務(wù)被加入為止。

到這里,我們就很好地解釋了,當allowCoreThreadTimeOut=true或者此時工作線程大于corePoolSize時,線程調(diào)用BlockingQueue的poll方法獲取任務(wù),若超過keepAliveTime時間,則返回null,timedOut=true,則getTask會返回null,線程中的runWorker方法會退出while循環(huán),線程接下來會被回收。

下面我們測試一下:

以上所述是小編給大家介紹的java線程池設(shè)置詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • SpringBoot從yml配置文件中讀常用參數(shù)值實例方法

    SpringBoot從yml配置文件中讀常用參數(shù)值實例方法

    在本篇文章里小編給大家整理了關(guān)于SpringBoot從yml配置文件中讀常用參數(shù)值實例方法,有需要的朋友們學(xué)習(xí)下。
    2019-12-12
  • Java容器源碼LinkedList原理解析

    Java容器源碼LinkedList原理解析

    這篇文章主要介紹了Java容器源碼LinkedList原理解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • Java之Spring注解配置bean實例代碼解析

    Java之Spring注解配置bean實例代碼解析

    這篇文章主要介紹了Java之Spring注解配置bean實例代碼解析,具有一定參考價值,文中還有有關(guān)Spring學(xué)習(xí)的資料下載鏈接及相關(guān)內(nèi)容推薦,需要的朋友可以了解下。
    2017-09-09
  • Java?SpringAOP技術(shù)之注解方式詳解

    Java?SpringAOP技術(shù)之注解方式詳解

    這篇文章主要為大家詳細介紹了Java?SpringAOP技術(shù)之注解方式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Java實現(xiàn)雙端鏈表LinkedList

    Java實現(xiàn)雙端鏈表LinkedList

    本文主要介紹了Java實現(xiàn)雙端鏈表LinkedList,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • SpringCloud Alibaba使用Seata處理分布式事務(wù)的技巧

    SpringCloud Alibaba使用Seata處理分布式事務(wù)的技巧

    在傳統(tǒng)的單體項目中,我們使用@Transactional注解就能實現(xiàn)基本的ACID事務(wù)了,隨著微服務(wù)架構(gòu)的引入,需要對數(shù)據(jù)庫進行分庫分表,每個服務(wù)擁有自己的數(shù)據(jù)庫,這樣傳統(tǒng)的事務(wù)就不起作用了,那么我們?nèi)绾伪WC多個服務(wù)中數(shù)據(jù)的一致性呢?跟隨小編一起通過本文了解下吧
    2021-06-06
  • SpringBoot集成slf4j2日志配置的實現(xiàn)示例

    SpringBoot集成slf4j2日志配置的實現(xiàn)示例

    本文主要介紹了SpringBoot集成slf4j2日志配置的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • Maven中利用assembly插件打包jar包

    Maven中利用assembly插件打包jar包

    本文詳細講解了Maven中利用assembly插件打包jar包的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • spring framework源碼調(diào)試技巧

    spring framework源碼調(diào)試技巧

    這篇文章給大家介紹了spring-framework源碼調(diào)試方法,可以直接將最新代碼clone到本地,如果想在代碼做一些注釋,也可以Fork到自己的倉庫。本文采用Fork的方式,并添加了測試module,感興趣的朋友一起看看吧
    2021-10-10
  • Java實現(xiàn)時間動態(tài)顯示方法匯總

    Java實現(xiàn)時間動態(tài)顯示方法匯總

    這篇文章主要介紹了Java實現(xiàn)時間動態(tài)顯示方法匯總,很實用的功能,需要的朋友可以參考下
    2014-08-08

最新評論

隆昌县| 虎林市| 岳西县| 宜阳县| 安仁县| 古浪县| 六枝特区| 万州区| 福清市| 长治县| 沾益县| 福州市| 吉安市| 吐鲁番市| 东山县| 福海县| 浑源县| 漾濞| 藁城市| 和平县| 融水| 岳西县| 扎鲁特旗| 汝州市| 宁远县| 萍乡市| 定陶县| 孝感市| 左云县| 酉阳| 沙坪坝区| 伽师县| 昌宁县| 巴南区| 新昌县| 宣汉县| 株洲市| 凉城县| 卢龙县| 东台市| 黄龙县|