ExecutorService讓我們可以?xún)?yōu)雅地在程序中使用線(xiàn)程池來(lái)創(chuàng)建和管理線(xiàn)程,而且性能佳、開(kāi)銷(xiāo)小,還可以有效地控制大并發(fā)線(xiàn)程數(shù),是我們?cè)趈ava并發(fā)編程中會(huì)經(jīng)常使用到的。
創(chuàng)新互聯(lián)自2013年創(chuàng)立以來(lái),是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元萬(wàn)州做網(wǎng)站,已為上家服務(wù),為萬(wàn)州各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話(huà):18980820575每一個(gè)線(xiàn)程都會(huì)占用系統(tǒng)資源,因此線(xiàn)程池的關(guān)閉與清理同樣重要,本文介紹我們?nèi)绾蝺?yōu)雅地關(guān)閉線(xiàn)程池。
停止接收新任務(wù),原來(lái)的任務(wù)繼續(xù)執(zhí)行
停止接收新任務(wù),原來(lái)的任務(wù)停止執(zhí)行
說(shuō)明:它試圖終止線(xiàn)程的方法是通過(guò)調(diào)用 Thread.interrupt() 方法來(lái)實(shí)現(xiàn)的,這種方法的作用有限,如果線(xiàn)程中沒(méi)有sleep 、wait、Condition、定時(shí)鎖等應(yīng)用, interrupt() 方法是無(wú)法中斷當(dāng)前的線(xiàn)程的。所以,shutdownNow() 并不代表線(xiàn)程池就一定立即就能退出,它也可能必須要等待所有正在執(zhí)行的任務(wù)都執(zhí)行完成了才能退出。但是大多數(shù)時(shí)候是能立即退出的。
當(dāng)前線(xiàn)程阻塞,timeout 和 TimeUnit 兩個(gè)參數(shù),用于設(shè)定超時(shí)的時(shí)間及單位,當(dāng)前線(xiàn)程阻塞,直到:
然后會(huì)監(jiān)測(cè) ExecutorService 是否已經(jīng)關(guān)閉,返回true(shutdown請(qǐng)求后所有任務(wù)執(zhí)行完畢)或false(已超時(shí))
shutdown()
只是關(guān)閉了提交通道,用submit()是無(wú)效的;而內(nèi)部該怎么跑還是怎么跑,跑完再停。shutdownNow()
能立即停止線(xiàn)程池,正在跑的和正在等待的任務(wù)都停下了。shutdown()
后,不能再提交新的任務(wù)進(jìn)去;但是 awaitTermination() 后,可以繼續(xù)提交。awaitTermination()
是阻塞的,返回結(jié)果是線(xiàn)程池是否已停止(true/false);shutdown() 不阻塞。RunTime.getRunTime().addShutdownHook()的作用就是在JVM銷(xiāo)毀前執(zhí)行的最后一個(gè)線(xiàn)程,通過(guò)addShutdownHook添加鉤子,當(dāng)系統(tǒng)執(zhí)行完這些鉤子后,jvm才會(huì)關(guān)閉,因此我們可以在這個(gè)線(xiàn)程中把我們前面使用ExecutorService創(chuàng)建的線(xiàn)程池優(yōu)雅地關(guān)閉掉。
在web3j中異步執(zhí)行類(lèi)(Async)中有如下代碼:
// 創(chuàng)建線(xiàn)程池
private static final ExecutorService executor = Executors.newCachedThreadPool();
// 添加關(guān)閉線(xiàn)程池的鉤子
static {
Runtime.getRuntime().addShutdownHook(new Thread(() - > shutdown(executor)));
}
// 關(guān)閉線(xiàn)程池的鉤子函數(shù)
private static void shutdown(ExecutorService executorService) {
// 第一步:使新任務(wù)無(wú)法提交
executorService.shutdown();
try {
// 第二步:等待未完成任務(wù)結(jié)束
if(!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
// 第三步:取消當(dāng)前執(zhí)行的任務(wù)
executorService.shutdownNow();
// 第四步:等待任務(wù)取消的響應(yīng)
if(!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
System.err.println("Thread pool did not terminate");
}
}
} catch(InterruptedException ie) {
// 第五步:出現(xiàn)異常后,重新取消當(dāng)前執(zhí)行的任務(wù)
executorService.shutdownNow();
Thread.currentThread().interrupt(); // 設(shè)置本線(xiàn)程中斷狀態(tài)
}
}
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。