chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何正確關(guān)閉線程池

Android編程精選 ? 來(lái)源:CSDN博客 ? 作者:不懂的浪漫 ? 2021-09-29 14:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言本章分為兩個(gè)議題

如何正確關(guān)閉線程池

shutdown 和 shutdownNow 的區(qū)別

項(xiàng)目環(huán)境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() + “-》執(zhí)行”);

});

}

}

}

執(zhí)行結(jié)果

pool-1-thread-2-》執(zhí)行

pool-1-thread-3-》執(zhí)行

pool-1-thread-1-》執(zhí)行

pool-1-thread-4-》執(zhí)行

pool-1-thread-5-》執(zhí)行

pool-1-thread-6-》執(zhí)行

。..

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

void shutdown

boolean isShutdown

boolean isTerminated

boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException

List《Runnable》 shutdownNow

2.shutdown

第一種方法叫作 shutdown(),它可以安全地關(guān)閉一個(gè)線程池,調(diào)用 shutdown() 方法之后線程池并不是立刻就被關(guān)閉,因?yàn)檫@時(shí)線程池中可能還有很多任務(wù)正在被執(zhí)行,或是任務(wù)隊(duì)列中有大量正在等待被執(zhí)行的任務(wù),調(diào)用 shutdown() 方法后線程池會(huì)在執(zhí)行完正在執(zhí)行的任務(wù)和隊(duì)列中等待的任務(wù)后才徹底關(guān)閉。

調(diào)用 shutdown() 方法后如果還有新的任務(wù)被提交,線程池則會(huì)根據(jù)拒絕策略直接拒絕后續(xù)新提交的任務(wù)。學(xué)習(xí)資料:Java進(jìn)階視頻資源

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

java.util.concurrent.ThreadPoolExecutor#execute

public void execute(Runnable command) {

if (command == null)

throw new NullPointerException();

int c = ctl.get();

// 線程池中的線程比核心線程數(shù)少

if (workerCountOf(c) 《 corePoolSize) {

// 新建一個(gè)核心線程執(zhí)行任務(wù)

if (addWorker(command, true))

return;

c = ctl.get();

}

// 核心線程已滿,但是任務(wù)隊(duì)列未滿,添加到隊(duì)列中

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

int recheck = ctl.get();

// 任務(wù)成功添加到隊(duì)列以后,再次檢查是否需要添加新的線程,因?yàn)橐汛嬖诘木€程可能被銷(xiāo)毀了

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

// 如果線程池處于非運(yùn)行狀態(tài),并且把當(dāng)前的任務(wù)從任務(wù)隊(duì)列中移除成功,則拒絕該任務(wù)

reject(command);

else if (workerCountOf(recheck) == 0)

// 如果之前的線程已經(jīng)被銷(xiāo)毀完,新建一個(gè)非核心線程

addWorker(null, false);

}

// 核心線程池已滿,隊(duì)列已滿,嘗試創(chuàng)建一個(gè)非核心新的線程

else if (!addWorker(command, false))

// 如果創(chuàng)建新線程失敗,說(shuō)明線程池關(guān)閉或者線程池滿了,拒絕任務(wù)

reject(command);

}

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

1378 行 else if (!addWorker(command, false))如果創(chuàng)建新線程失敗,說(shuō)明線程池關(guān)閉或者線程池滿了,拒絕任務(wù)。

3.isShutdown

第二個(gè)方法叫作 isShutdown(),它可以返回 true 或者 false 來(lái)判斷線程池是否已經(jīng)開(kāi)始了關(guān)閉工作,也就是是否執(zhí)行了 shutdown 或者 shutdownNow 方法。

這里需要注意,如果調(diào)用 isShutdown() 方法的返回的結(jié)果為 true 并不代表線程池此時(shí)已經(jīng)徹底關(guān)閉了,這僅僅代表線程池開(kāi)始了關(guān)閉的流程,也就是說(shuō),此時(shí)可能線程池中依然有線程在執(zhí)行任務(wù),隊(duì)列里也可能有等待被執(zhí)行的任務(wù)。

4.isTerminated

第三種方法叫作 isTerminated(),這個(gè)方法可以檢測(cè)線程池是否真正“終結(jié)”了,這不僅代表線程池已關(guān)閉,同時(shí)代表線程池中的所有任務(wù)都已經(jīng)都執(zhí)行完畢了。

比如我們上面提到的情況,如果此時(shí)已經(jīng)調(diào)用了 shutdown 方法,但是還有任務(wù)沒(méi)有執(zhí)行完,那么此時(shí)調(diào)用 isShutdown 方法返回的是 true,而 isTerminated 方法則會(huì)返回 false。

直到所有任務(wù)都執(zhí)行完畢了,調(diào)用 isTerminated() 方法才會(huì)返回 true,這表示線程池已關(guān)閉并且線程池內(nèi)部是空的,所有剩余的任務(wù)都執(zhí)行完畢了。

學(xué)習(xí)資料:Java進(jìn)階視頻資源

5.awaitTermination

第四個(gè)方法叫作 awaitTermination(),它本身并不是用來(lái)關(guān)閉線程池的,而是主要用來(lái)判斷線程池狀態(tài)的。

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

等待期間(包括進(jìn)入等待狀態(tài)之前)線程池已關(guān)閉并且所有已提交的任務(wù)(包括正在執(zhí)行的和隊(duì)列中等待的)都執(zhí)行完畢,相當(dāng)于線程池已經(jīng)“終結(jié)”了,方法便會(huì)返回 true

等待超時(shí)時(shí)間到后,第一種線程池“終結(jié)”的情況始終未發(fā)生,方法返回 false

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

調(diào)用 awaitTermination 方法后當(dāng)前線程會(huì)嘗試等待一段指定的時(shí)間,如果在等待時(shí)間內(nèi),線程池已關(guān)閉并且內(nèi)部的任務(wù)都執(zhí)行完畢了,也就是說(shuō)線程池真正“終結(jié)”了,那么方法就返回 true,否則超時(shí)返回 fasle。

6.shutdownNow

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

在執(zhí)行 shutdownNow 方法之后,首先會(huì)給所有線程池中的線程發(fā)送 interrupt 中斷信號(hào),嘗試中斷這些任務(wù)的執(zhí)行,然后會(huì)將任務(wù)隊(duì)列中正在等待的所有任務(wù)轉(zhuǎn)移到一個(gè) List 中并返回,我們可以根據(jù)返回的任務(wù) List 來(lái)進(jìn)行一些補(bǔ)救的操作,例如記錄在案并在后期重試。

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

讓每一個(gè)已經(jīng)啟動(dòng)的線程都中斷,這樣線程就可以在執(zhí)行任務(wù)期間檢測(cè)到中斷信號(hào)并進(jìn)行相應(yīng)的處理,提前結(jié)束任務(wù)

7.shutdown 和 shutdownNow 的區(qū)別?

shutdown 會(huì)等待線程池中的任務(wù)執(zhí)行完成之后關(guān)閉線程池,而 shutdownNow 會(huì)給所有線程發(fā)送中斷信號(hào),中斷任務(wù)執(zhí)行,然后關(guān)閉線程池

shutdown 沒(méi)有返回值,而 shutdownNow 會(huì)返回關(guān)閉前任務(wù)隊(duì)列中未執(zhí)行的任務(wù)集合(List)

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2811

    瀏覽量

    52280
  • 多線程
    +關(guān)注

    關(guān)注

    0

    文章

    279

    瀏覽量

    20764

原文標(biāo)題:正確關(guān)閉線程池:shutdown 和 shutdownNow 的區(qū)別

文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    線程問(wèn)題,線程已經(jīng)創(chuàng)建成功了,為什么線程調(diào)用的函數(shù)不會(huì)運(yùn)行呢?

    我這個(gè)線程創(chuàng)建成功了,為啥ai_thread_entry()函數(shù)不運(yùn)行呢? void airun_thread() { /* 創(chuàng)建 serial 線程 */ rt_thread_t
    發(fā)表于 10-10 08:02

    tcpip線程被mu0鎖住導(dǎo)致網(wǎng)絡(luò)線程無(wú)法使用怎么解決?

    各位好,我使用rtthread開(kāi)發(fā)STM32F407VGT6芯片,程序有多個(gè)線程,每個(gè)線程都會(huì)創(chuàng)建一個(gè)socket,建立tcp連接或者udp連接,現(xiàn)在出現(xiàn)一個(gè)問(wèn)題,程序長(zhǎng)時(shí)間運(yùn)行有概率死機(jī),但是沒(méi)有
    發(fā)表于 09-29 06:41

    啟用了控制臺(tái)后,空閑線程是不是永遠(yuǎn)不會(huì)進(jìn)入?

    在控制臺(tái)里打印線程(list thread)時(shí),發(fā)現(xiàn)已經(jīng)退出的線程已經(jīng)是CLOSE狀態(tài),但是都是僵尸線程。然后查看shell代碼,看到控制臺(tái)一直在跑,所以手動(dòng)添加了延時(shí)(rt_thread_delay)進(jìn)入,但調(diào)試看到空閑
    發(fā)表于 09-19 06:53

    線程的安全注意事項(xiàng)

    線程安全是指多個(gè)線程同時(shí)訪問(wèn)或修改共享資源時(shí),能夠保證程序的正確性和可靠性。 開(kāi)發(fā)者選擇TaskPool或Worker進(jìn)行多線程開(kāi)發(fā)時(shí),在TaskPool和Worker的工作
    發(fā)表于 06-20 07:49

    對(duì)于配置為Source的CCG3PA應(yīng)用,完全關(guān)閉輸出的正確方法應(yīng)該是什么?

    你好對(duì)于配置為 Source 的 CCG3PA 應(yīng)用,支持 EVAL_HB_BC_1EDN7550B 1.2、USB-PD (+PPS) 和 Type-C,完全關(guān)閉輸出的正確方法應(yīng)該是什么,并在以后
    發(fā)表于 05-27 06:23

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類(lèi)庫(kù)案例:ThreadPoll

    1、程序簡(jiǎn)介該程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類(lèi)庫(kù)的線程處理:ThreadPoll。本案例完成如下工作:創(chuàng)建1個(gè)線程,設(shè)置該
    的頭像 發(fā)表于 02-10 18:09 ?511次閱讀
    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類(lèi)庫(kù)案例:ThreadPoll

    hyper shift,hyper-v的正確關(guān)閉步驟

    ? ? 在服務(wù)器管理與資源優(yōu)化的宏大舞臺(tái)上,Hyper-V憑借強(qiáng)大的功能和出色的性能,為用戶帶來(lái)了高效、靈活的虛擬化體驗(yàn)。今天給大家介紹hyper-v的正確關(guān)閉步驟? ? ?hyper-v的正確
    的頭像 發(fā)表于 01-23 11:09 ?1732次閱讀
    hyper shift,hyper-v的<b class='flag-5'>正確</b><b class='flag-5'>關(guān)閉</b>步驟

    hyper-v 關(guān)閉,hyper-v的正確使用流程

    ? ? 在企業(yè)的IT基礎(chǔ)設(shè)施中,Hyper-V虛擬機(jī)的地位愈發(fā)重要。今天給大家介紹hyper-v的正確使用流程? ? ?hyper-v的正確使用流程? ? ?啟用Hyper-V,Windows系統(tǒng)
    的頭像 發(fā)表于 01-22 15:04 ?814次閱讀
    hyper-v <b class='flag-5'>關(guān)閉</b>,hyper-v的<b class='flag-5'>正確</b>使用流程

    ISP與IP地址

    ISP可以為用戶提供互聯(lián)網(wǎng)接入、信息內(nèi)容、應(yīng)用服務(wù)以及其他增值業(yè)務(wù)。 要知道,在ISP的網(wǎng)絡(luò)中,IP地址幾乎可以說(shuō)不可或缺。IP地址是指一定范圍內(nèi)可供分配的IP地址的集合。通過(guò)分配IP地址,設(shè)備
    的頭像 發(fā)表于 12-27 10:41 ?756次閱讀

    深入探索:海外IP代理的安全性與管理

    海外IP代理的安全性與管理是使用這一工具時(shí)不可忽視的重要方面。
    的頭像 發(fā)表于 11-14 07:39 ?670次閱讀

    構(gòu)建便捷海外IP代理:策略與實(shí)踐

    構(gòu)建便捷海外IP代理是一個(gè)涉及多方面策略與實(shí)踐的過(guò)程。
    的頭像 發(fā)表于 11-14 07:34 ?705次閱讀

    socket 多線程編程實(shí)現(xiàn)方法

    在現(xiàn)代網(wǎng)絡(luò)編程中,多線程技術(shù)被廣泛應(yīng)用于提高服務(wù)器的并發(fā)處理能力。Socket編程是網(wǎng)絡(luò)通信的基礎(chǔ),而將多線程技術(shù)應(yīng)用于Socket編程,可以顯著提升服務(wù)器的性能。 多線程編程的基本概念 多
    的頭像 發(fā)表于 11-12 14:16 ?1335次閱讀

    的無(wú)線測(cè)溫在線監(jiān)測(cè)系統(tǒng)

    今天分享的酒廠窖的無(wú)線測(cè)溫系統(tǒng),包含硬件和軟件為一體的標(biāo)準(zhǔn)解決方案。 行業(yè)背景 說(shuō)到窖的測(cè)溫,不得不從酒廠的酒廠的發(fā)酵說(shuō)起。酒廠發(fā)酵是指用于生產(chǎn)釀酒的一種設(shè)備,通常由不銹鋼或玻
    的頭像 發(fā)表于 10-28 09:52 ?571次閱讀
    窖<b class='flag-5'>池</b>的無(wú)線測(cè)溫在線監(jiān)測(cè)系統(tǒng)

    怎么在JAVA中確定線性大小

    在JAVA中確定線性大小,分別介紹CPU密集型任務(wù)和I/O密集型任務(wù)及其處理方法。
    的頭像 發(fā)表于 10-24 14:02 ?649次閱讀

    Python中多線程和多進(jìn)程的區(qū)別

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