我想編寫一個測試,以在執行可中斷呼叫時中斷線程,例如, Thread.sleep
。如何在Java中同步Thread.sleep和Thread.interrupt?
我想同步兩個線程:一個線程調用Thread.sleep
,另一個線程等待,直到第一個線程開始休眠,並用Thread.interrupt
中斷它。
如何確保第二個線程在開始睡眠後中斷第一個線程?可能嗎 ?
我想編寫一個測試,以在執行可中斷呼叫時中斷線程,例如, Thread.sleep
。如何在Java中同步Thread.sleep和Thread.interrupt?
我想同步兩個線程:一個線程調用Thread.sleep
,另一個線程等待,直到第一個線程開始休眠,並用Thread.interrupt
中斷它。
如何確保第二個線程在開始睡眠後中斷第一個線程?可能嗎 ?
爲什麼在調用Thread.sleep後需要中斷?中斷被調用以使它的效果是相同的,無論它的調用時間是在調用sleep()之前還是之後。你想要測試它嗎?然後在一個循環中輪詢,直到線程TIMED_WAITING狀態得到:
t1.start();
while (t1.getState()!= Thread.State.TIMED_WAITING) {
Thread.sleep(10);
}
t1.interrupt();
是的,這是一個測試。我只是想測試這個特殊情況。線程狀態輪詢聽起來像我所需要的。謝謝。 – Michael
您無法確定,因爲例如操作系統可能會決定在Thread.sleep
語句之前掛起第一個線程。在實踐中,如果你能在第二個線程過多,以及同步使用一個小的睡眠,它應該是罰款:
final CountdownLatch start = new CountdownLatch(1);
final Thread t1 = new Thread (new Runnable() {
public void run() {
start.await();
Thread.sleep(1000);
}
});
Thread t2 = new Thread (new Runnable() {
public void run() {
start.await();
Thread.sleep(100); //wait a little to make sure that t1 is asleep
t1.interrupt();
}
});
t1.start();
t2.start();
Thread.sleep(100); //wait to make sure both threads are started
start.countdown();
使用同步器,並從臥鋪線程睡覺前通知其鎖定的斷續線。引入一個非常小的延遲(遠小於睡眠線程的睡眠時間),喚醒後在睡眠線程上發生中斷。
保證2個線程後,對方開始,你將需要使用
join()
例如(忽略處理例外) :
Thread t1 = new Thread();
Thread t2 = new Thread();
t1.start();
t2.join();
t2.start();
我沒有測試代碼,但這裏是獲取更多信息的文檔: https://docs.oracle.com/javase/tutorial/essential/concurrency/join.html
你有沒有嘗試過Thread.interrupt()? – BlackJoker
好的。我看到我的問題不清楚。我知道我應該使用Thread.interrupt。問題是如何保證Tread.interrupt被調用_after_ Thread.sleep被調用。我在編輯這個問題。 – Michael
請參閱http://stackoverflow.com/questions/15225579/what-will-happen-if-you-call-interrupt-on-a-sleeping-thread?rq=1 – Manish