將run()里面的停頓時間改為是sleep()后,當(dāng)主線程執(zhí)行thread.interrupt()的疑問
將run()里面停頓時間改為是sleep()后,當(dāng)主線程執(zhí)行thread.interrupt()后,this.isInterrupted()的值為ture,那么while語句應(yīng)該停止,為什么還會執(zhí)行Thread.sleep()從而拋出異常?視頻8分鐘開始那里
將run()里面停頓時間改為是sleep()后,當(dāng)主線程執(zhí)行thread.interrupt()后,this.isInterrupted()的值為ture,那么while語句應(yīng)該停止,為什么還會執(zhí)行Thread.sleep()從而拋出異常?視頻8分鐘開始那里
2018-08-22
舉報
2019-07-10
薇辣醬?說得對, 是概率問題,子線程中while (!this.isInterrupted()) 這句話運行的時間非常短,子線程的絕大部分時間都在Thread.sleep(xxxx);這句話上,所以在主線程中將子線程中斷的時候(主線程執(zhí)行thread.interrupt()的時候),子線程有極大的概率處于sleep中,然后就會報sleep中斷錯誤(sleep interrupted)。
簡單的驗證:
在子線程的sleep語句前后各加一個輸出,比如“子線程將睡眠XX秒”和“子線程睡眠結(jié)束”,然后你會發(fā)現(xiàn)異常都出現(xiàn)在“子線程將睡眠XX秒”這句后面,然后沒有出現(xiàn)相匹配的“子線程睡眠結(jié)束”,也就是說主線程在將子線程中斷的時候,子線程都處于sleep的狀態(tài)(絕大部分時候)。
處于非sleep的狀態(tài)如果真的試出來了,應(yīng)該是會出現(xiàn)“子線程將睡眠XX秒”和“子線程睡眠結(jié)束”,然后子線程退出循環(huán)。
2019-04-18
我想明白了,因為thread是從上一次停下來的位置開始運行的,不是從while (!this.isInterrupted())這里開始。而sleep占用了while循環(huán)大多數(shù)時間,所以上次大概率是在sleep()這里停的。
所以重新運行的時候,一開始就拋出了InterruptedException異常,同時this.isInterrupted()被置為false。然后while循環(huán)就一直運行下去了。
我將run循環(huán)內(nèi)容做了一些修改,你可以看的更清楚。
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()是測試線程的狀態(tài)是否是interrupted的。
這個狀態(tài)時由thread.interrupt()方法來置位的,但是thread.interrupt()方法置位為interrupted狀態(tài)的前提是線程處于非阻塞狀態(tài),否則thread.interrupt()只會把interrupted清除并且拋出異常。
因為這里調(diào)用Thread.sleep()使線程處于阻塞狀態(tài),所以線程非但沒有被置為interrupted,反而拋出了異常。
while循環(huán)的執(zhí)行大部分時間應(yīng)該是在Thread.sleep()上的,幾乎不可能在Thread.sleep()剛好結(jié)束而還沒有進行while(true)判斷的時候thread.interrupt()置位為interrupted狀態(tài)
2018-11-13
thread.interrupt()方法的作用是喚醒阻塞的線程,并拋出異常。當(dāng)sleep后,線程阻塞,thread.interrupt()方法執(zhí)行后,線程又被喚醒并拋出異常。因為線程被喚醒,所以this.isInterrupted()的值為false,while語句繼續(xù)
2018-08-22
先拋出的一場,然后重置變量