【線程池】如何正確的關(guān)閉線程池
關(guān)閉線程池的方法
shutdown()
在調(diào)用這個(gè)關(guān)閉方法時(shí),線程池會(huì)根據(jù)我們配置的拒絕策略來(lái)拒絕掉想要進(jìn)來(lái)的線程,也就是說(shuō)吧創(chuàng)建執(zhí)行線程的入口給關(guān)閉掉了,直到線程池內(nèi)的所有線程都執(zhí)行完成。在調(diào)用這個(gè)方法完畢之后,并不代表這個(gè)線程池就真的都停掉了,只能說(shuō)他不讓其他線程進(jìn)來(lái)了,然后等到線程池內(nèi)的線程執(zhí)行完。
shutdownNow()
shutdownNow相對(duì)于shutdown的加強(qiáng)版,因?yàn)樗梢约涌炀€程的執(zhí)行的的關(guān)閉速度,通過(guò)向線程池中的線程發(fā)送interrupt中斷信號(hào)來(lái)達(dá)到讓線程盡快結(jié)束的目的,于此同時(shí)也會(huì)和shutdown方法一樣,根據(jù)拒絕策略來(lái)拒絕掉想要進(jìn)來(lái)的線程。
判斷線程池是否關(guān)閉的方法
isShutdown()
這個(gè)方法就是用來(lái)判斷我們線程是否開(kāi)始執(zhí)行了shutdown方法,當(dāng)沒(méi)有調(diào)用shutdown方法時(shí),isShutdown返回的false,如果調(diào)用了shutdown方法,這個(gè)時(shí)候isShutdown返回的則是ture,值的注意的是,當(dāng)isShutdown返回true并不代表這個(gè)線程池是關(guān)閉狀態(tài)了,這個(gè)方法只代表著線程有沒(méi)有開(kāi)始執(zhí)行線程關(guān)閉的方法。
isTerminated()
isTerminated就表示著線程池還有沒(méi)有線程正在執(zhí)行,如果當(dāng)還有線程未執(zhí)行完成,那么他就會(huì)返回false,當(dāng)線程中所有的任務(wù)都執(zhí)行完成了,那么他才會(huì)返回ture。他跟isShutdown不同的是,isShutdown方法表示有沒(méi)有開(kāi)始停止線程池任務(wù),而isTerminated表示的是,停止線程池的任務(wù)有沒(méi)有執(zhí)行完成。
awaitTermination()
與isTerminated不同的是,awaitTermination有一個(gè)等待時(shí)間,如果將等待時(shí)間設(shè)置為10s,那么在執(zhí)行這個(gè)方法后,awaitTermination方法會(huì)等待10s,如果10s內(nèi)所有的線程都執(zhí)行完成了,他就會(huì)提前返回ture,反之如果到了10s后所有的方法還沒(méi)有執(zhí)行完畢,則會(huì)返回false。在等待的同時(shí),如果當(dāng)先等待的線程收到了interrupt中斷信號(hào),同樣的他也會(huì)跑出interrupt的異常。
總結(jié)
上面結(jié)束的五個(gè)方法,其實(shí)都是很好的去解決我們業(yè)務(wù)中常見(jiàn)的停止線程的場(chǎng)景。只要我們將這些方法的作用吃透。在停止線程池的時(shí)候,根據(jù)我們自己需要的場(chǎng)景來(lái)去停止,這樣其實(shí)就可以達(dá)到了正確停止線程池的目的了。

浙公網(wǎng)安備 33010602011771號(hào)