課程
/后端開發(fā)
/Java
/深入淺出Java多線程
第10行的 sleep() 為什么不會使interrupt拋出異常
2016-03-25
源自:深入淺出Java多線程 3-3
正在回答
感覺聽視頻里講,不如來看評論,評論描述的還清楚些
第10行的sleep,休眠的是main主線程,這樣thread線程可以獨占cpu運行。主線程休眠了3秒,中間thread輸出了三條Thread?is?running,每秒一條。sleep結(jié)束后,主線程重新占用cpu,輸出interrupting?threading。。。主線程又休眠三秒,讓出cpu,但是interrupt沒有起作用(為什么?)thread?繼續(xù)每秒一條無限輸出
meersun
根據(jù)我知道的說一下我的理解,不保證一定正確,如有錯誤歡迎指正。
其實這個問題引出了一些很有用的點。
先把視頻中的代碼貼出來,除了最后幾行,行數(shù)都是對應的
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)?{ //?... } } } }
第一個點,main本身也是一個線程,通常稱為主線程,這個程序一開始做的事情是,主線程創(chuàng)建了一個WrongWayStopThread實例,叫做thread,并start之,此時主進程和thread同時運行
第二個點,sleep()是static的,sleep()做的事情是將“當前sleep()所在”進程休眠
題主說的第十行附近的
Thread.sleep(3000);
是對語句所在進程,即主進程進行sleep。注意這里的Thread是大寫,代表的是調(diào)用Thread類的靜態(tài)方法sleep。
(注意即使改成小寫thread.sleep(3000),因為是static方法,執(zhí)行的是的同樣操作,依舊是休眠主進程,可以試驗驗證。換句話說,不管怎么寫sleep,一個線程只能對自己進行自發(fā)的sleep,不能sleep別的進程)
然后15行的
thread.interrupt();
注意interrupt不是static,任意進程都可以對指定的另一個線程做interrupt,這里thread是小寫,指的是主線程對剛剛創(chuàng)建的WrongWayStopThread實例thread做interrupt。
總結(jié)就是,第十行左右的sleep的線程,和之后interrupt的線程,不是同一個線程,所以不會影響。但我認為這其中的原理更重要。
sleep()方法只是使當前線程暫時進入休眠狀態(tài),并沒有阻斷當前線程的運行。
舉報
帶你一起深入淺出多線程,掌握基礎,展望進階路線
3 回答關(guān)于sleep();
2 回答sleep問題
5 回答sleep的問題
2 回答sleep()使用問題
2 回答為什么不能用sleep
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網(wǎng)安備11010802030151號
購課補貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動學習伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號
2019-05-22
感覺聽視頻里講,不如來看評論,評論描述的還清楚些
2016-04-26
2016-04-09
根據(jù)我知道的說一下我的理解,不保證一定正確,如有錯誤歡迎指正。
其實這個問題引出了一些很有用的點。
先把視頻中的代碼貼出來,除了最后幾行,行數(shù)都是對應的
第一個點,main本身也是一個線程,通常稱為主線程,這個程序一開始做的事情是,主線程創(chuàng)建了一個WrongWayStopThread實例,叫做thread,并start之,此時主進程和thread同時運行
第二個點,sleep()是static的,sleep()做的事情是將“當前sleep()所在”進程休眠
題主說的第十行附近的
是對語句所在進程,即主進程進行sleep。注意這里的Thread是大寫,代表的是調(diào)用Thread類的靜態(tài)方法sleep。
(注意即使改成小寫thread.sleep(3000),因為是static方法,執(zhí)行的是的同樣操作,依舊是休眠主進程,可以試驗驗證。換句話說,不管怎么寫sleep,一個線程只能對自己進行自發(fā)的sleep,不能sleep別的進程)
然后15行的
注意interrupt不是static,任意進程都可以對指定的另一個線程做interrupt,這里thread是小寫,指的是主線程對剛剛創(chuàng)建的WrongWayStopThread實例thread做interrupt。
總結(jié)就是,第十行左右的sleep的線程,和之后interrupt的線程,不是同一個線程,所以不會影響。但我認為這其中的原理更重要。
2016-03-25
sleep()方法只是使當前線程暫時進入休眠狀態(tài),并沒有阻斷當前線程的運行。