国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

    文章

    2837

    瀏覽量

    53283
  • 多線程
    +關注

    關注

    0

    文章

    279

    瀏覽量

    21027

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    解析Linux的進程、線程和協程

    系統的穩定性和安全性。 (3)創建與銷毀:Linux使用fork()系統調用來創建新進程,通過exit()來終止進程。 線程(Thread) 線程是進程內的執行單元,多個線程共享相同的內存空間
    發表于 12-22 11:00

    開放協作,共筑生態——思爾芯參與上海開放處理器產業創新中心開業儀式暨RISC-V專利聯盟專利儀式

    在推動芯片產業自主創新、構建開放協作生態的背景下,上海開放處理器產業創新中心(SOPIC)于2025年12月12日在上海張江正式舉辦開業儀式。同期舉行的RISC-V專利儀式上,思爾芯作為首批入
    的頭像 發表于 12-15 17:38 ?1149次閱讀
    開放協作,共筑生態——思爾芯參與上海開放處理器產業創新中心開業儀式暨RISC-V專利聯盟專利<b class='flag-5'>池</b>入<b class='flag-5'>池</b>儀式

    C語言內存使用

    ,整個堆有可能被弄得支離破碎,最終導致大量內存浪費。 那么這種情況下,我們解決這類問題的思路,就是創建一個內存。 內存,實際上就是我們讓程序創建出來的一塊額外的緩存區域,如果有需要釋放內存,先
    發表于 12-11 07:57

    線程的系統

    線程系統的事件響應也是在中斷中完成的,但事件的處理是在線程中完成的。在多線程系統中,線程跟中斷一樣,也具有優先級,優先級高的線程會被優先執
    發表于 12-08 07:55

    Linux多線程對比單線程的優勢

    在Linux系統中,線程是操作系統能夠進行運算調度的最小單位。線程被包含在進程之中,是進程中的實際運行單位。一個進程可以擁有多個線程,這些線程共享相同的內存空間和系統資源。
    發表于 12-01 06:11

    數據全復用高性能化層設計思路分享

    大家好,本團隊此次分享的內容為可實現數據全復用高性能化層設計思路,核心部分主要由以下3個部分組成; 1.SRAM讀取模塊;——化使用的存儲為SRAM 基于SRAM讀與寫時序,約束化模塊讀與寫
    發表于 10-29 07:10

    線程問題,線程已經創建成功了,為什么線程調用的函數不會運行呢?

    我這個線程創建成功了,為啥ai_thread_entry()函數不運行呢? void airun_thread() { /* 創建 serial 線程 */ rt_thread_t
    發表于 10-10 08:02

    tcpip線程被mu0鎖住導致網絡線程無法使用怎么解決?

    各位好,我使用rtthread開發STM32F407VGT6芯片,程序有多個線程,每個線程都會創建一個socket,建立tcp連接或者udp連接,現在出現一個問題,程序長時間運行有概率死機,但是沒有
    發表于 09-29 06:41

    啟用了控制臺后,空閑線程是不是永遠不會進入?

    在控制臺里打印線程(list thread)時,發現已經退出的線程已經是CLOSE狀態,但是都是僵尸線程。然后查看shell代碼,看到控制臺一直在跑,所以手動添加了延時(rt_thread_delay)進入,但調試看到空閑
    發表于 09-19 06:53

    rtth studio中nano 如何創建動態線程

    有沒有大佬,可以說一下為什么靜態線程可以正常使用,動態線程怎么也使用不了。 具體需要什么配置才能使用動態線程創建。謝謝!
    發表于 09-11 06:01

    線程超時函數中 assert 失敗是什么原因導致的?

    最近調試 gd32h759 遇到了一個十分奇怪的問題,在初步調通所有的邏輯功能后,發現系統經常會在運行一段時間后死在一個奇怪的線程超時函數中 assert 失敗導致卡死。用 cmbacktrace
    發表于 09-09 06:56

    線程的安全注意事項

    線程安全是指多個線程同時訪問或修改共享資源時,能夠保證程序的正確性和可靠性。 開發者選擇TaskPool或Worker進行多線程開發時,在TaskPool和Worker的工作
    發表于 06-20 07:49

    鴻蒙5開發寶藏案例分享---應用并發設計

    線程 --> |系統托管| FFRT_I/O[FFRT I/O線程] 三大核心理念 : 內存隔離 :線程間禁止直接共享對象 異步
    發表于 06-12 16:19

    對于配置為Source的CCG3PA應用,完全關閉輸出的正確方法應該是什么?

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

    進程、線程、協程傻傻分不清?一文帶你徹底扒光它們的\"底褲\"!

    () as session: async with session.get(url) as response: return await response.text() ? async def main(): # 線程
    發表于 03-26 09:27