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

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

sleep()

第10行的 sleep() 為什么不會使interrupt拋出異常

正在回答

4 回答

感覺聽視頻里講,不如來看評論,評論描述的還清楚些

0 回復 有任何疑惑可以回復我~
第10行的sleep,休眠的是main主線程,這樣thread線程可以獨占cpu運行。主線程休眠了3秒,中間thread輸出了三條Thread?is?running,每秒一條。sleep結束后,主線程重新占用cpu,輸出interrupting?threading。。。主線程又休眠三秒,讓出cpu,但是interrupt沒有起作用(為什么?)thread?繼續每秒一條無限輸出


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

meersun

還是沒搞明白,坐等大俠來搭救
2016-04-26 回復 有任何疑惑可以回復我~

根據我知道的說一下我的理解,不保證一定正確,如有錯誤歡迎指正。

其實這個問題引出了一些很有用的點。

先把視頻中的代碼貼出來,除了最后幾行,行數都是對應的

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的線程,不是同一個線程,所以不會影響。但我認為這其中的原理更重要。

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

sleep()方法只是使當前線程暫時進入休眠狀態,并沒有阻斷當前線程的運行。

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

舉報

0/150
提交
取消
深入淺出Java多線程
  • 參與學習       186072    人
  • 解答問題       502    個

帶你一起深入淺出多線程,掌握基礎,展望進階路線

進入課程
微信客服

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

幫助反饋 APP下載

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

公眾號

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