[英]How to synchronize Thread.sleep and Thread.interrupt in Java?
我想編寫一個在執行可中斷調用(例如Thread.sleep
時中斷線程的測試。
我想同步兩個線程:一個線程調用Thread.sleep
,另一個線程等待直到第一個線程開始休眠並用Thread.interrupt
中斷它。
如何確保第二個線程在開始休眠后中斷第一個線程? 可能嗎 ?
您無法確定,因為例如操作系統可能決定在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();
使用同步器,並在從睡眠線程休眠之前通知中斷線程處於其鎖定狀態。 引入非常小的延遲(遠遠少於睡眠線程的睡眠時間),並且在喚醒后在睡眠線程上發出中斷。
為什么要在調用Thread.sleep之后中斷? 進行中斷以使它的效果與調用時間無關,無論它是在調用sleep()之前還是之后。 您只想測試一下嗎? 然后循環輪詢,直到線程進入TIMED_WAITING狀態:
t1.start();
while (t1.getState()!= Thread.State.TIMED_WAITING) {
Thread.sleep(10);
}
t1.interrupt();
為了確保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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.