課程
/后端開(kāi)發(fā)
/Java
/深入淺出Java多線程
interrupt清楚阻塞狀態(tài)并拋出異常,這和中斷有啥關(guān)系?
2017-01-24
源自:深入淺出Java多線程 3-3
正在回答
3-3 Java線程停止廣為流傳的錯(cuò)誤方法---interrupt方法
這節(jié)課老師講的初衷是interrupt方法不能正確地停止線程,是停止.interrupt方法本身就是中斷線程的意思.能中斷但不能停止線程.
你這個(gè)問(wèn)題好問(wèn)的笑死我了,那你咋不問(wèn)stop的意思是停止,他為什么不能停止呢
是中斷不是終斷;
比如講師在本節(jié)課中的一個(gè)例子:
package?com.imooc.demo; public?class?WrongWayStopThread?extends?Thread?{ public?static?void?main(String[]?args)?{ WrongWayStopThread?thread??=?new?WrongWayStopThread(); System.out.println("Starting?thread"); thread.start(); try?{ Thread.sleep(3000); }?catch?(InterruptedException?e)?{ //?TODO?Auto-generated?catch?block e.printStackTrace(); } System.out.println("Tnterrupting?thread"); thread.interrupt(); try?{ Thread.sleep(3000); }?catch?(InterruptedException?e)?{ //?TODO?Auto-generated?catch?block e.printStackTrace(); } System.out.println("Stopping?thread"); } @Override public?void?run()?{ // 在線程之中,我們定義了一個(gè)無(wú)限循環(huán)的while()結(jié)構(gòu),在while()循環(huán)之中,我輸出線程正在運(yùn)行的信息 // 然后嵌套一個(gè)空的while()循環(huán),減少屏幕輸出,使得每秒只輸出一行信息,它的作用大致相當(dāng)于Thread.sleep(1000) // 但是為什么不是Thread.sleep(1000)? // while?(!this.isInterrupted())?{ System.out.println("Thread?is?running"); long?time?=?System.currentTimeMillis(); while?((System.currentTimeMillis()?-?time)?<?1000)?{ // try?{ // Thread.sleep(1000); // }?catch?(InterruptedException?e)?{ // //?TODO?Auto-generated?catch?block // e.printStackTrace(); // } } } } }
我們知道m(xù)ain也一個(gè)主線程,在執(zhí)行到程序的入口,也就是main()方法的時(shí)候,程序就會(huì)產(chǎn)生一個(gè)線程,然后調(diào)用start()的時(shí)候會(huì)產(chǎn)生一個(gè)線程,這兩個(gè)線程并行,調(diào)用Thread.sleep(3000),指的是讓main這個(gè)主線程休眠3秒,我們的thread線程才搶占資源運(yùn)行,隨著main線程3秒后的恢復(fù),thread線程就恢復(fù)了搶占資源的狀態(tài),然后main線程讀取到了thread.interrupt(),也就是說(shuō)thread線程進(jìn)行了終止,那么isInterrupted()的返回值就是true,所以while()循環(huán)會(huì)停止,也就是說(shuō),thread線程結(jié)束了,然后經(jīng)過(guò)Thread.sleep(),主線程就又停止了3秒,然后輸出線程停止。
一家之言,敬請(qǐng)指正!
官方就是這么叫的。。。咱們也沒(méi)辦法啊
舉報(bào)
帶你一起深入淺出多線程,掌握基礎(chǔ),展望進(jìn)階路線
1 回答為什么主線程Thread.sleep(1000)后,會(huì)清除別的線程的interrupt狀態(tài)呢?
3 回答個(gè)人練習(xí):正確使用interrupt()停止進(jìn)程
3 回答關(guān)于Sleep對(duì)interrupt的影響
2 回答線程并不能交替運(yùn)行
4 回答為什么我直接使用interrupt能直接終止進(jìn)程?運(yùn)行結(jié)果居然是正確的
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號(hào)-11 京公網(wǎng)安備11010802030151號(hào)
購(gòu)課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動(dòng)學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號(hào)
2018-09-16
3-3 Java線程停止廣為流傳的錯(cuò)誤方法---interrupt方法
這節(jié)課老師講的初衷是interrupt方法不能正確地停止線程,是停止.interrupt方法本身就是中斷線程的意思.能中斷但不能停止線程.
2017-09-22
你這個(gè)問(wèn)題好問(wèn)的笑死我了,那你咋不問(wèn)stop的意思是停止,他為什么不能停止呢
2017-04-05
是中斷不是終斷;
比如講師在本節(jié)課中的一個(gè)例子:
我們知道m(xù)ain也一個(gè)主線程,在執(zhí)行到程序的入口,也就是main()方法的時(shí)候,程序就會(huì)產(chǎn)生一個(gè)線程,然后調(diào)用start()的時(shí)候會(huì)產(chǎn)生一個(gè)線程,這兩個(gè)線程并行,調(diào)用Thread.sleep(3000),指的是讓main這個(gè)主線程休眠3秒,我們的thread線程才搶占資源運(yùn)行,隨著main線程3秒后的恢復(fù),thread線程就恢復(fù)了搶占資源的狀態(tài),然后main線程讀取到了thread.interrupt(),也就是說(shuō)thread線程進(jìn)行了終止,那么isInterrupted()的返回值就是true,所以while()循環(huán)會(huì)停止,也就是說(shuō),thread線程結(jié)束了,然后經(jīng)過(guò)Thread.sleep(),主線程就又停止了3秒,然后輸出線程停止。
一家之言,敬請(qǐng)指正!
2017-01-25
官方就是這么叫的。。。咱們也沒(méi)辦法啊