亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

將run()里面的停頓時間改為是sleep()后,當主線程執行thread.interrupt()的疑問

將run()里面停頓時間改為是sleep()后,當主線程執行thread.interrupt()后,this.isInterrupted()的值為ture,那么while語句應該停止,為什么還會執行Thread.sleep()從而拋出異常?視頻8分鐘開始那里

正在回答

6 回答

薇辣醬?說得對, 是概率問題,子線程中while (!this.isInterrupted()) 這句話運行的時間非常短,子線程的絕大部分時間都在Thread.sleep(xxxx);這句話上,所以在主線程中將子線程中斷的時候(主線程執行thread.interrupt()的時候),子線程有極大的概率處于sleep中,然后就會報sleep中斷錯誤(sleep interrupted)。


簡單的驗證:

在子線程的sleep語句前后各加一個輸出,比如“子線程將睡眠XX秒”和“子線程睡眠結束”,然后你會發現異常都出現在“子線程將睡眠XX秒”這句后面,然后沒有出現相匹配的“子線程睡眠結束”,也就是說主線程在將子線程中斷的時候,子線程都處于sleep的狀態(絕大部分時候)。

處于非sleep的狀態如果真的試出來了,應該是會出現“子線程將睡眠XX秒”和“子線程睡眠結束”,然后子線程退出循環。

0 回復 有任何疑惑可以回復我~

我想明白了,因為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...


2 回復 有任何疑惑可以回復我~

我也沒弄明白這個問題,求解答。。。

0 回復 有任何疑惑可以回復我~

this.isInterrupted()是測試線程的狀態是否是interrupted的。

這個狀態時由thread.interrupt()方法來置位的,但是thread.interrupt()方法置位為interrupted狀態的前提是線程處于非阻塞狀態,否則thread.interrupt()只會把interrupted清除并且拋出異常。

因為這里調用Thread.sleep()使線程處于阻塞狀態,所以線程非但沒有被置為interrupted,反而拋出了異常。


while循環的執行大部分時間應該是在Thread.sleep()上的,幾乎不可能在Thread.sleep()剛好結束而還沒有進行while(true)判斷的時候thread.interrupt()置位為interrupted狀態

1 回復 有任何疑惑可以回復我~

thread.interrupt()方法的作用是喚醒阻塞的線程,并拋出異常。當sleep后,線程阻塞,thread.interrupt()方法執行后,線程又被喚醒并拋出異常。因為線程被喚醒,所以this.isInterrupted()的值為false,while語句繼續

2 回復 有任何疑惑可以回復我~

先拋出的一場,然后重置變量

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

將run()里面的停頓時間改為是sleep()后,當主線程執行thread.interrupt()的疑問

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號