課程
/后端開發(fā)
/Java
/深入淺出Java多線程
第10行的 sleep() 為什么不會(huì)使interrupt拋出異常
2016-03-25
源自:深入淺出Java多線程 3-3
正在回答
感覺聽視頻里講,不如來看評(píng)論,評(píng)論描述的還清楚些
第10行的sleep,休眠的是main主線程,這樣thread線程可以獨(dú)占cpu運(yùn)行。主線程休眠了3秒,中間thread輸出了三條Thread?is?running,每秒一條。sleep結(jié)束后,主線程重新占用cpu,輸出interrupting?threading。。。主線程又休眠三秒,讓出cpu,但是interrupt沒有起作用(為什么?)thread?繼續(xù)每秒一條無限輸出
meersun
根據(jù)我知道的說一下我的理解,不保證一定正確,如有錯(cuò)誤歡迎指正。
其實(shí)這個(gè)問題引出了一些很有用的點(diǎn)。
先把視頻中的代碼貼出來,除了最后幾行,行數(shù)都是對(duì)應(yīng)的
package?base; 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)?{ e.printStackTrace(); } System.out.println("Interrupting?Thread..."); thread.interrupt(); try?{ Thread.sleep(3000); }?catch?(InterruptedException?e)?{ e.printStackTrace(); } System.out.println("Stopping?Application..."); } @Override public?void?run()?{ while?(true)?{ System.out.println("Thread?is?running"); long?time?=?System.currentTimeMillis(); while?(System.currentTimeMillis()?-?time?<?1000)?{ //?... } } } }
第一個(gè)點(diǎn),main本身也是一個(gè)線程,通常稱為主線程,這個(gè)程序一開始做的事情是,主線程創(chuàng)建了一個(gè)WrongWayStopThread實(shí)例,叫做thread,并start之,此時(shí)主進(jìn)程和thread同時(shí)運(yùn)行
第二個(gè)點(diǎn),sleep()是static的,sleep()做的事情是將“當(dāng)前sleep()所在”進(jìn)程休眠
題主說的第十行附近的
Thread.sleep(3000);
是對(duì)語(yǔ)句所在進(jìn)程,即主進(jìn)程進(jìn)行sleep。注意這里的Thread是大寫,代表的是調(diào)用Thread類的靜態(tài)方法sleep。
(注意即使改成小寫thread.sleep(3000),因?yàn)槭莝tatic方法,執(zhí)行的是的同樣操作,依舊是休眠主進(jìn)程,可以試驗(yàn)驗(yàn)證。換句話說,不管怎么寫sleep,一個(gè)線程只能對(duì)自己進(jìn)行自發(fā)的sleep,不能sleep別的進(jìn)程)
然后15行的
thread.interrupt();
注意interrupt不是static,任意進(jìn)程都可以對(duì)指定的另一個(gè)線程做interrupt,這里thread是小寫,指的是主線程對(duì)剛剛創(chuàng)建的WrongWayStopThread實(shí)例thread做interrupt。
總結(jié)就是,第十行左右的sleep的線程,和之后interrupt的線程,不是同一個(gè)線程,所以不會(huì)影響。但我認(rèn)為這其中的原理更重要。
sleep()方法只是使當(dāng)前線程暫時(shí)進(jìn)入休眠狀態(tài),并沒有阻斷當(dāng)前線程的運(yùn)行。
舉報(bào)
帶你一起深入淺出多線程,掌握基礎(chǔ),展望進(jìn)階路線
3 回答關(guān)于sleep();
2 回答sleep問題
5 回答sleep的問題
2 回答sleep()使用問題
2 回答為什么不能用sleep
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)
2019-05-22
感覺聽視頻里講,不如來看評(píng)論,評(píng)論描述的還清楚些
2016-04-26
2016-04-09
根據(jù)我知道的說一下我的理解,不保證一定正確,如有錯(cuò)誤歡迎指正。
其實(shí)這個(gè)問題引出了一些很有用的點(diǎn)。
先把視頻中的代碼貼出來,除了最后幾行,行數(shù)都是對(duì)應(yīng)的
第一個(gè)點(diǎn),main本身也是一個(gè)線程,通常稱為主線程,這個(gè)程序一開始做的事情是,主線程創(chuàng)建了一個(gè)WrongWayStopThread實(shí)例,叫做thread,并start之,此時(shí)主進(jìn)程和thread同時(shí)運(yùn)行
第二個(gè)點(diǎn),sleep()是static的,sleep()做的事情是將“當(dāng)前sleep()所在”進(jìn)程休眠
題主說的第十行附近的
是對(duì)語(yǔ)句所在進(jìn)程,即主進(jìn)程進(jìn)行sleep。注意這里的Thread是大寫,代表的是調(diào)用Thread類的靜態(tài)方法sleep。
(注意即使改成小寫thread.sleep(3000),因?yàn)槭莝tatic方法,執(zhí)行的是的同樣操作,依舊是休眠主進(jìn)程,可以試驗(yàn)驗(yàn)證。換句話說,不管怎么寫sleep,一個(gè)線程只能對(duì)自己進(jìn)行自發(fā)的sleep,不能sleep別的進(jìn)程)
然后15行的
注意interrupt不是static,任意進(jìn)程都可以對(duì)指定的另一個(gè)線程做interrupt,這里thread是小寫,指的是主線程對(duì)剛剛創(chuàng)建的WrongWayStopThread實(shí)例thread做interrupt。
總結(jié)就是,第十行左右的sleep的線程,和之后interrupt的線程,不是同一個(gè)線程,所以不會(huì)影響。但我認(rèn)為這其中的原理更重要。
2016-03-25
sleep()方法只是使當(dāng)前線程暫時(shí)進(jìn)入休眠狀態(tài),并沒有阻斷當(dāng)前線程的運(yùn)行。