思考一下
- 在線程1中如何終止線程2?
- stop()?還是System.exit()?還是其他方式
方式解答
1.使用stop()不可取
線程對(duì)象的stop()方法會(huì)直接殺死線程,假設(shè)此時(shí)使用了線程鎖,當(dāng)此時(shí)使用了stop()命令會(huì)導(dǎo)致線程鎖無法釋放,以至于程序出現(xiàn)嚴(yán)重的問題,其中最常見的是死鎖。還可能導(dǎo)致資源泄露,因?yàn)槠渌€程無法獲取到被持有的資源。這可能會(huì)導(dǎo)致內(nèi)存泄露或者其他資源的持續(xù)占用,最終導(dǎo)致系統(tǒng)資源耗盡。
什么是死鎖?
死鎖是指兩個(gè)或多個(gè)線程相互持有對(duì)方所需的資源,導(dǎo)致它們都在等待對(duì)方釋放資源,從而永遠(yuǎn)無法繼續(xù)執(zhí)行下去。當(dāng)發(fā)生死鎖時(shí),程序可能會(huì)完全停止響應(yīng),或者表現(xiàn)出非常低的性能。在生產(chǎn)環(huán)境中,死鎖可能導(dǎo)致程序崩潰或系統(tǒng)不穩(wěn)定。
2.System.exit(int)不可取
System.exit(int)此方法是停止所有線程,此做法會(huì)使程序整個(gè)終止掉。
詳細(xì)解釋
文章來源:http://www.zghlxwxcb.cn/news/detail-811304.html
- 當(dāng)調(diào)用
System.exit(int)
時(shí),JVM 將立即終止當(dāng)前程序的執(zhí)行,并返回一個(gè)整數(shù)狀態(tài)碼。通常情況下,返回值 0表示程序正常結(jié)束,非零值表示程序出現(xiàn)了某種異常或錯(cuò)誤。這意味著可以根據(jù)System.exit(int)
返回值來判斷程序的結(jié)束狀態(tài),并在必要時(shí)采取相應(yīng)的措施。 - 需要注意的是,調(diào)用
System.exit(int)
將立即終止程序的執(zhí)行,因此任何在該方法調(diào)用之后的代碼都將不會(huì)被執(zhí)行。因此,需要小心使用該方法,避免在不必要的情況下過早地終止程序的執(zhí)行。 - 通常情況下,不建議在常規(guī)的程序流程中經(jīng)常使用
System.exit(int)
,除非在特定情況下需要強(qiáng)制結(jié)束程序的執(zhí)行。更好的做法是通過返回值或異常來控制程序的執(zhí)行流程。
正確停止: Two-phase Termination(兩階段終止)模式
- 將終止過程分成兩個(gè)階段,其中第一個(gè)階段主要是線程 T1 向線程 T2發(fā)送終止指令,而第 二階段則是線程 T2響應(yīng)終止指令。
- Java 線程進(jìn)入終止?fàn)顟B(tài)的前提是線程進(jìn)入 RUNNABLE 狀態(tài),而利用java線程中斷機(jī)制的interrupt()方法,可以讓線程從休眠狀態(tài)轉(zhuǎn)換到RUNNABLE 狀態(tài)。RUNNABLE 狀態(tài)轉(zhuǎn)換到終止?fàn)顟B(tài),讓 Java 線程自己執(zhí)行完 run()方法,所以一般我們采用的方法是設(shè)置一個(gè)標(biāo)志位,然后線程會(huì)在這個(gè)標(biāo)志位檢查,如果發(fā)現(xiàn)符合終止條件,則自動(dòng)退出run() 方法。
兩階段終止模式是一種應(yīng)用很廣泛的并發(fā)設(shè)計(jì)模式,在 Java 語言中使用兩階段終止模式來終止線程,需要注意兩個(gè)關(guān)鍵點(diǎn):文章來源地址http://www.zghlxwxcb.cn/news/detail-811304.html
- 僅檢查終止標(biāo)志位是不夠的,因?yàn)榫€程的狀態(tài)可能處于休眠態(tài);
- 僅檢查線程的中斷狀態(tài)也是不夠的,因?yàn)槲覀円蕾嚨牡谌筋悗?kù)很可能沒有正確處理中斷異常.
例如:
Google Guava庫(kù)中的com.google.common.io.Files
類中的copy
方法。在早期的版本中,這個(gè)方法可能沒有正確處理中斷異常。當(dāng)在文件拷貝過程中線程被中斷時(shí),該方法可能會(huì)忽略中斷并繼續(xù)執(zhí)行文件拷貝操作,而不會(huì)拋出InterruptedException
。開發(fā)人員可能需要手動(dòng)捕獲中斷異常并進(jìn)行適當(dāng)?shù)奶幚怼?/li>
使用場(chǎng)景
- 安全地終止線程,比如釋放該釋放的資源;
- 要確保終止處理邏輯在線程結(jié)束之前一定會(huì)執(zhí)行時(shí),可使用該方法;
到了這里,關(guān)于設(shè)計(jì)模式之并發(fā)特定場(chǎng)景下的設(shè)計(jì)模式 Two-phase Termination(兩階段終止)模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!