將run()里面的停頓時間改為是sleep()后,當主線程執行thread.interrupt()的疑問
將run()里面停頓時間改為是sleep()后,當主線程執行thread.interrupt()后,this.isInterrupted()的值為ture,那么while語句應該停止,為什么還會執行Thread.sleep()從而拋出異常?視頻8分鐘開始那里
將run()里面停頓時間改為是sleep()后,當主線程執行thread.interrupt()后,this.isInterrupted()的值為ture,那么while語句應該停止,為什么還會執行Thread.sleep()從而拋出異常?視頻8分鐘開始那里
2018-08-22
舉報
2019-07-10
薇辣醬?說得對, 是概率問題,子線程中while (!this.isInterrupted()) 這句話運行的時間非常短,子線程的絕大部分時間都在Thread.sleep(xxxx);這句話上,所以在主線程中將子線程中斷的時候(主線程執行thread.interrupt()的時候),子線程有極大的概率處于sleep中,然后就會報sleep中斷錯誤(sleep interrupted)。
簡單的驗證:
在子線程的sleep語句前后各加一個輸出,比如“子線程將睡眠XX秒”和“子線程睡眠結束”,然后你會發現異常都出現在“子線程將睡眠XX秒”這句后面,然后沒有出現相匹配的“子線程睡眠結束”,也就是說主線程在將子線程中斷的時候,子線程都處于sleep的狀態(絕大部分時候)。
處于非sleep的狀態如果真的試出來了,應該是會出現“子線程將睡眠XX秒”和“子線程睡眠結束”,然后子線程退出循環。
2019-04-18
我想明白了,因為thread是從上一次停下來的位置開始運行的,不是從while (!this.isInterrupted())這里開始。而sleep占用了while循環大多數時間,所以上次大概率是在sleep()這里停的。
所以重新運行的時候,一開始就拋出了InterruptedException異常,同時this.isInterrupted()被置為false。然后while循環就一直運行下去了。
我將run循環內容做了一些修改,你可以看的更清楚。
public void run() {
????int i = 0;
????while (!this.isInterrupted()) {
????????System.out.println(i);
????????try {
????????????Thread.sleep(4000);
?????????} catch (InterruptedException e) {
????????????e.printStackTrace();
????????????System.out.println(i+1000);
????????}
????????System.out.println(i);
????????i++;
????}
}
輸出為:
Starting Thread...
0
Interrupting Thread...
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at WrongWayStopThread.run(WrongWayStopThread.java:28)
1000
0
1
1
2
2
3
Stopping Application...
2019-04-18
我也沒弄明白這個問題,求解答。。。
2019-04-08
this.isInterrupted()是測試線程的狀態是否是interrupted的。
這個狀態時由thread.interrupt()方法來置位的,但是thread.interrupt()方法置位為interrupted狀態的前提是線程處于非阻塞狀態,否則thread.interrupt()只會把interrupted清除并且拋出異常。
因為這里調用Thread.sleep()使線程處于阻塞狀態,所以線程非但沒有被置為interrupted,反而拋出了異常。
while循環的執行大部分時間應該是在Thread.sleep()上的,幾乎不可能在Thread.sleep()剛好結束而還沒有進行while(true)判斷的時候thread.interrupt()置位為interrupted狀態
2018-11-13
thread.interrupt()方法的作用是喚醒阻塞的線程,并拋出異常。當sleep后,線程阻塞,thread.interrupt()方法執行后,線程又被喚醒并拋出異常。因為線程被喚醒,所以this.isInterrupted()的值為false,while語句繼續
2018-08-22
先拋出的一場,然后重置變量