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