色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何正確關閉線程池

Android編程精選 ? 來源:CSDN博客 ? 作者:不懂的浪漫 ? 2021-09-29 14:41 ? 次閱讀

前言本章分為兩個議題

如何正確關閉線程池

shutdown 和 shutdownNow 的區別

項目環境jdk 1.8

github 地址:https://github.com/huajiexiewenfeng/java-concurrent

本章模塊:threadpool

1.線程池示例

public class ShutDownThreadPoolDemo {

private ExecutorService service = Executors.newFixedThreadPool(10);

public static void main(String[] args) {

new ShutDownThreadPoolDemo().executeTask();

}

public void executeTask() {

for (int i = 0; i 《 100; i++) {

service.submit(() -》 {

System.out.println(Thread.currentThread().getName() + “-》執行”);

});

}

}

}

執行結果

pool-1-thread-2-》執行

pool-1-thread-3-》執行

pool-1-thread-1-》執行

pool-1-thread-4-》執行

pool-1-thread-5-》執行

pool-1-thread-6-》執行

。..

執行完成之后,主線程會一直阻塞,那么如何關閉線程池呢?本章介紹 5 種在 ThreadPoolExecutor 中涉及關閉線程池的方法,如下所示

void shutdown

boolean isShutdown

boolean isTerminated

boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException

List《Runnable》 shutdownNow

2.shutdown

第一種方法叫作 shutdown(),它可以安全地關閉一個線程池,調用 shutdown() 方法之后線程池并不是立刻就被關閉,因為這時線程池中可能還有很多任務正在被執行,或是任務隊列中有大量正在等待被執行的任務,調用 shutdown() 方法后線程池會在執行完正在執行的任務和隊列中等待的任務后才徹底關閉。

調用 shutdown() 方法后如果還有新的任務被提交,線程池則會根據拒絕策略直接拒絕后續新提交的任務。學習資料:Java進階視頻資源

這段源碼位置(jdk 1.8 版本)

java.util.concurrent.ThreadPoolExecutor#execute

public void execute(Runnable command) {

if (command == null)

throw new NullPointerException();

int c = ctl.get();

// 線程池中的線程比核心線程數少

if (workerCountOf(c) 《 corePoolSize) {

// 新建一個核心線程執行任務

if (addWorker(command, true))

return;

c = ctl.get();

}

// 核心線程已滿,但是任務隊列未滿,添加到隊列中

if (isRunning(c) && workQueue.offer(command)) {

int recheck = ctl.get();

// 任務成功添加到隊列以后,再次檢查是否需要添加新的線程,因為已存在的線程可能被銷毀了

if (! isRunning(recheck) && remove(command))

// 如果線程池處于非運行狀態,并且把當前的任務從任務隊列中移除成功,則拒絕該任務

reject(command);

else if (workerCountOf(recheck) == 0)

// 如果之前的線程已經被銷毀完,新建一個非核心線程

addWorker(null, false);

}

// 核心線程池已滿,隊列已滿,嘗試創建一個非核心新的線程

else if (!addWorker(command, false))

// 如果創建新線程失敗,說明線程池關閉或者線程池滿了,拒絕任務

reject(command);

}

1373 行 if (! isRunning(recheck) && remove(command))如果線程池被關閉,將當前的任務從任務隊列中移除成功,并拒絕該任務

1378 行 else if (!addWorker(command, false))如果創建新線程失敗,說明線程池關閉或者線程池滿了,拒絕任務。

3.isShutdown

第二個方法叫作 isShutdown(),它可以返回 true 或者 false 來判斷線程池是否已經開始了關閉工作,也就是是否執行了 shutdown 或者 shutdownNow 方法。

這里需要注意,如果調用 isShutdown() 方法的返回的結果為 true 并不代表線程池此時已經徹底關閉了,這僅僅代表線程池開始了關閉的流程,也就是說,此時可能線程池中依然有線程在執行任務,隊列里也可能有等待被執行的任務。

4.isTerminated

第三種方法叫作 isTerminated(),這個方法可以檢測線程池是否真正“終結”了,這不僅代表線程池已關閉,同時代表線程池中的所有任務都已經都執行完畢了。

比如我們上面提到的情況,如果此時已經調用了 shutdown 方法,但是還有任務沒有執行完,那么此時調用 isShutdown 方法返回的是 true,而 isTerminated 方法則會返回 false。

直到所有任務都執行完畢了,調用 isTerminated() 方法才會返回 true,這表示線程池已關閉并且線程池內部是空的,所有剩余的任務都執行完畢了。

學習資料:Java進階視頻資源

5.awaitTermination

第四個方法叫作 awaitTermination(),它本身并不是用來關閉線程池的,而是主要用來判斷線程池狀態的。

比如我們給 awaitTermination 方法傳入的參數是 10 秒,那么它就會陷入 10 秒鐘的等待,直到發生以下三種情況之一:

等待期間(包括進入等待狀態之前)線程池已關閉并且所有已提交的任務(包括正在執行的和隊列中等待的)都執行完畢,相當于線程池已經“終結”了,方法便會返回 true

等待超時時間到后,第一種線程池“終結”的情況始終未發生,方法返回 false

等待期間線程被中斷,方法會拋出 InterruptedException 異常

調用 awaitTermination 方法后當前線程會嘗試等待一段指定的時間,如果在等待時間內,線程池已關閉并且內部的任務都執行完畢了,也就是說線程池真正“終結”了,那么方法就返回 true,否則超時返回 fasle。

6.shutdownNow

最后一個方法是 shutdownNow(),它和 shutdown() 的區別就是多了一個 Now,表示立刻關閉的意思,不推薦使用這一種方式關閉線程池。

在執行 shutdownNow 方法之后,首先會給所有線程池中的線程發送 interrupt 中斷信號,嘗試中斷這些任務的執行,然后會將任務隊列中正在等待的所有任務轉移到一個 List 中并返回,我們可以根據返回的任務 List 來進行一些補救的操作,例如記錄在案并在后期重試。

shutdownNow 源碼如下:

public List《Runnable》 shutdownNow() {

List《Runnable》 tasks;

final ReentrantLock mainLock = this.mainLock;

mainLock.lock();

try {

checkShutdownAccess();

advanceRunState(STOP);

interruptWorkers();

tasks = drainQueue();

} finally {

mainLock.unlock();

}

tryTerminate();

return tasks;

}

interruptWorkers

讓每一個已經啟動的線程都中斷,這樣線程就可以在執行任務期間檢測到中斷信號并進行相應的處理,提前結束任務

7.shutdown 和 shutdownNow 的區別?

shutdown 會等待線程池中的任務執行完成之后關閉線程池,而 shutdownNow 會給所有線程發送中斷信號,中斷任務執行,然后關閉線程池

shutdown 沒有返回值,而 shutdownNow 會返回關閉前任務隊列中未執行的任務集合(List)

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 模塊
    +關注

    關注

    7

    文章

    2695

    瀏覽量

    47431
  • 多線程
    +關注

    關注

    0

    文章

    278

    瀏覽量

    19943

原文標題:正確關閉線程池:shutdown 和 shutdownNow 的區別

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Python中多線程和多進程的區別

    Python作為一種高級編程語言,提供了多種并發編程的方式,其中多線程與多進程是最常見的兩種方式之一。在本文中,我們將探討Python中多線程與多進程的概念、區別以及如何使用線程與進
    的頭像 發表于 10-23 11:48 ?392次閱讀
    Python中多<b class='flag-5'>線程</b>和多進程的區別

    智能水表怎么安裝是正確的?

    正確安裝智能水表不僅能確保其正常工作,還能延長使用壽命,提高測量精度。下面我們將詳細介紹智能水表的正確安裝步驟和注意事項,幫助您順利完成安裝。1.準備工具和材料-工具:扳手、管鉗、生料帶、螺絲刀等
    的頭像 發表于 09-21 15:44 ?429次閱讀
    智能水表怎么安裝是<b class='flag-5'>正確</b>的?

    買藥秒送 JADE動態線程實踐及原理淺析

    一、背景及JADE介紹 買藥秒送是健康即時零售業務新的核心流量場域,面對京東首頁高流量曝光,我們對頻道頁整個技術架構方案進行升級,保障接口高性能、系統高可用。 動態線程是買藥頻道應用的技術之一
    的頭像 發表于 09-04 11:11 ?830次閱讀
    買藥秒送 JADE動態<b class='flag-5'>線程</b><b class='flag-5'>池</b>實踐及原理淺析

    CPU線程和程序線程的區別

    CPU的線程與程序的線程在概念、作用、實現方式以及性能影響等方面存在顯著差異。以下是對兩者區別的詳細闡述,旨在深入探討這一技術話題。
    的頭像 發表于 09-02 11:18 ?979次閱讀

    基于OpenHarmony標準系統的C++公共基礎類庫案例:ThreadPoll

    ) { // 等待關閉所有的線程,會等待線程程序全部結束才返回 cout << \"stop thread: start\" <<
    發表于 08-12 11:42

    探索虛擬線程:原理與實現

    虛擬線程的引入與優勢 在Loom項目之前,Java虛擬機(JVM)中的線程是通過java.lang.Thread類型來實現的,這些線程被稱為平臺線程。 然而,平臺
    的頭像 發表于 06-24 11:35 ?288次閱讀
    探索虛擬<b class='flag-5'>線程</b>:原理與實現

    鴻蒙開發:【線程模型】

    管理其他線程的ArkTS引擎實例,例如使用TaskPool(任務)創建任務或取消任務、啟動和終止Worker線程
    的頭像 發表于 06-13 16:38 ?396次閱讀
    鴻蒙開發:【<b class='flag-5'>線程</b>模型】

    動態線程思想學習及實踐

    相關文檔 美團線程實踐:https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html 線程思想解
    的頭像 發表于 06-13 15:43 ?1181次閱讀
    動態<b class='flag-5'>線程</b><b class='flag-5'>池</b>思想學習及實踐

    OpenHarmony語言基礎類庫【@ohos.taskpool(啟動任務)】

    任務(taskpool)作用是為應用程序提供一個多線程的運行環境,降低整體資源的消耗、提高系統的整體性能,且您無需關心線程實例的生命周期。您可以使用任務API創建后臺任務(Task
    的頭像 發表于 04-24 17:45 ?346次閱讀
    OpenHarmony語言基礎類庫【@ohos.taskpool(啟動任務<b class='flag-5'>池</b>)】

    鴻蒙APP開發:【ArkTS類庫多線程】TaskPool和Worker的對比

    TaskPool(任務)和Worker的作用是為應用程序提供一個多線程的運行環境,用于處理耗時的計算任務或其他密集型任務。可以有效地避免這些任務阻塞主線程,從而最大化系統的利用率,降低整體資源消耗,并提高系統的整體性能。
    的頭像 發表于 03-26 22:09 ?608次閱讀
    鴻蒙APP開發:【ArkTS類庫多<b class='flag-5'>線程</b>】TaskPool和Worker的對比

    java實現多線程的幾種方式

    了多種實現多線程的方式,本文將詳細介紹以下幾種方式: 1.繼承Thread類 2.實現Runnable接口 3.Callable和Future 4.線程 5.Java 8中
    的頭像 發表于 03-14 16:55 ?687次閱讀

    python中5種線程鎖盤點

    線程安全是多線程或多進程編程中的一個概念,在擁有共享數據的多條線程并行執行的程序中,線程安全的代碼會通過同步機制保證各個線程都可以正常且
    發表于 03-07 11:08 ?1582次閱讀
    python中5種<b class='flag-5'>線程</b>鎖盤點

    使用ATOM和DTM關閉所有開關的正確方法是什么?

    = 1、SL0_x = 0、SL1_x = 0。但是,我不確定這是否是完成任務的適當方法。 在不依賴外部觸發器的情況下,通過軟件關閉(設置為低電平)所有輸出的\"正確\" 方法是什么?
    發表于 03-04 06:11

    什么是動態線程?動態線程的簡單實現思路

    因此,動態可監控線程一種針對以上痛點開發的線程管理工具。主要可實現功能有:提供對 Spring 應用內線程
    的頭像 發表于 02-28 10:42 ?639次閱讀

    .NET8性能優化之線程

    目前來說,沒有確切的證據證明哪個線程好用,或者效率更高。但是開發者可以使用上面的選項來進行自己的選擇,有一個測試就是在Windows線程在比較大的機器上的IO擴展性不太好。如果你的
    的頭像 發表于 01-22 14:50 ?1130次閱讀
    主站蜘蛛池模板: 狠狠干狠狠色| 樱花之恋动漫免费观看| 久久re视频精品538在线| 在线观看国产精美视频| 欧美不卡一区二区三区| 俄罗斯12一15处交| 亚洲欧美日韩人成| 毛片免费观看| 冠希和阿娇13分钟在线视频| 亚洲国产货青视觉盛宴| 精品视频在线播放| 色欲AV亚洲永久无码精品麻豆| 99视频免费在线| 美女被打开了屁股进去的视频| 一级毛片免费下载| 交换邻居波多野结衣中文字幕 | 99热久久久无码国产精品性麻豆| 精品久久久爽爽久久久AV| 亚洲AV无码乱码A片无码蜜桃| 国产成人在线视频网站| 色欲国产麻豆一精品一AV一免费| 把内衣脱了把奶露出来| 日韩高清特级特黄毛片| 大胸美女脱内衣黄网站| 视频一区国产在线二区| 国产1769一七六九视频在线| 色一欲一性一乱一区二区三区| 国产1000部成人免费视频| 四虎精品久久久久影院| 国产欧美亚洲综合第一页| 亚洲麻豆精品成人A在线观看| 久久视热频这里只精品| 综合久久久久久久综合网 | 特黄特色大片免费播放器9| 国产精品久久人妻无码网站一区无 | 好男人在线观看免费视频WWW| 偷拍 自怕 亚洲 在线| 千禧金瓶梅 快播| 免费观看久久| 理论片在线观看片免费| 含羞草免费完整视频在线观看|