ExecutorService讓我們可以優雅地在程序中使用線程池來創建和管理線程,而且性能佳、開銷小,還可以有效地控制大并發線程數,是我們在java并發編程中會經常使用到的。
每一個線程都會占用系統資源,因此線程池的關閉與清理同樣重要,本文介紹我們如何優雅地關閉線程池。
停止接收新任務,原來的任務繼續執行
停止接收新任務,原來的任務停止執行
說明:它試圖終止線程的方法是通過調用 Thread.interrupt() 方法來實現的,這種方法的作用有限,如果線程中沒有sleep 、wait、Condition、定時鎖等應用, interrupt() 方法是無法中斷當前的線程的。所以,shutdownNow() 并不代表線程池就一定立即就能退出,它也可能必須要等待所有正在執行的任務都執行完成了才能退出。但是大多數時候是能立即退出的。
當前線程阻塞,timeout 和 TimeUnit 兩個參數,用于設定超時的時間及單位,當前線程阻塞,直到:
然后會監測 ExecutorService 是否已經關閉,返回true(shutdown請求后所有任務執行完畢)或false(已超時)
shutdown()
只是關閉了提交通道,用submit()是無效的;而內部該怎么跑還是怎么跑,跑完再停。shutdownNow()
能立即停止線程池,正在跑的和正在等待的任務都停下了。shutdown()
后,不能再提交新的任務進去;但是 awaitTermination() 后,可以繼續提交。awaitTermination()
是阻塞的,返回結果是線程池是否已停止(true/false);shutdown() 不阻塞。RunTime.getRunTime().addShutdownHook()的作用就是在JVM銷毀前執行的最后一個線程,通過addShutdownHook添加鉤子,當系統執行完這些鉤子后,jvm才會關閉,因此我們可以在這個線程中把我們前面使用ExecutorService創建的線程池優雅地關閉掉。
在web3j中異步執行類(Async)中有如下代碼:
// 創建線程池
private static final ExecutorService executor = Executors.newCachedThreadPool();
// 添加關閉線程池的鉤子
static {
Runtime.getRuntime().addShutdownHook(new Thread(() - > shutdown(executor)));
}
// 關閉線程池的鉤子函數
private static void shutdown(ExecutorService executorService) {
// 第一步:使新任務無法提交
executorService.shutdown();
try {
// 第二步:等待未完成任務結束
if(!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
// 第三步:取消當前執行的任務
executorService.shutdownNow();
// 第四步:等待任務取消的響應
if(!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
System.err.println("Thread pool did not terminate");
}
}
} catch(InterruptedException ie) {
// 第五步:出現異常后,重新取消當前執行的任務
executorService.shutdownNow();
Thread.currentThread().interrupt(); // 設置本線程中斷狀態
}
}
另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
文章名稱:java如何使用ExecutorService關閉線程池?-創新互聯
文章URL:http://vcdvsql.cn/article24/cdeeje.html
成都網站建設公司_創新互聯,為您提供服務器托管、動態網站、云服務器、品牌網站設計、網站導航、移動網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯