課程
/后端開發
/Java
/深入淺出Java多線程
interrupt清楚阻塞狀態并拋出異常,這和中斷有啥關系?
2017-01-24
源自:深入淺出Java多線程 3-3
正在回答
3-3 Java線程停止廣為流傳的錯誤方法---interrupt方法
這節課老師講的初衷是interrupt方法不能正確地停止線程,是停止.interrupt方法本身就是中斷線程的意思.能中斷但不能停止線程.
你這個問題好問的笑死我了,那你咋不問stop的意思是停止,他為什么不能停止呢
是中斷不是終斷;
比如講師在本節課中的一個例子:
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()?{ // 在線程之中,我們定義了一個無限循環的while()結構,在while()循環之中,我輸出線程正在運行的信息 // 然后嵌套一個空的while()循環,減少屏幕輸出,使得每秒只輸出一行信息,它的作用大致相當于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(); // } } } } }
我們知道main也一個主線程,在執行到程序的入口,也就是main()方法的時候,程序就會產生一個線程,然后調用start()的時候會產生一個線程,這兩個線程并行,調用Thread.sleep(3000),指的是讓main這個主線程休眠3秒,我們的thread線程才搶占資源運行,隨著main線程3秒后的恢復,thread線程就恢復了搶占資源的狀態,然后main線程讀取到了thread.interrupt(),也就是說thread線程進行了終止,那么isInterrupted()的返回值就是true,所以while()循環會停止,也就是說,thread線程結束了,然后經過Thread.sleep(),主線程就又停止了3秒,然后輸出線程停止。
一家之言,敬請指正!
官方就是這么叫的。。。咱們也沒辦法啊
舉報
帶你一起深入淺出多線程,掌握基礎,展望進階路線
1 回答為什么主線程Thread.sleep(1000)后,會清除別的線程的interrupt狀態呢?
3 回答關于Sleep對interrupt的影響
3 回答個人練習:正確使用interrupt()停止進程
4 回答為什么我直接使用interrupt能直接終止進程?運行結果居然是正確的
2 回答線程并不能交替運行
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2018-09-16
3-3 Java線程停止廣為流傳的錯誤方法---interrupt方法
這節課老師講的初衷是interrupt方法不能正確地停止線程,是停止.interrupt方法本身就是中斷線程的意思.能中斷但不能停止線程.
2017-09-22
你這個問題好問的笑死我了,那你咋不問stop的意思是停止,他為什么不能停止呢
2017-04-05
是中斷不是終斷;
比如講師在本節課中的一個例子:
我們知道main也一個主線程,在執行到程序的入口,也就是main()方法的時候,程序就會產生一個線程,然后調用start()的時候會產生一個線程,這兩個線程并行,調用Thread.sleep(3000),指的是讓main這個主線程休眠3秒,我們的thread線程才搶占資源運行,隨著main線程3秒后的恢復,thread線程就恢復了搶占資源的狀態,然后main線程讀取到了thread.interrupt(),也就是說thread線程進行了終止,那么isInterrupted()的返回值就是true,所以while()循環會停止,也就是說,thread線程結束了,然后經過Thread.sleep(),主線程就又停止了3秒,然后輸出線程停止。
一家之言,敬請指正!
2017-01-25
官方就是這么叫的。。。咱們也沒辦法啊