2013-04-16 32 views
0

我想編寫一個測試,以在執行可中斷呼叫時中斷線程,例如, Thread.sleep如何在Java中同步Thread.sleep和Thread.interrupt?

我想同步兩個線程:一個線程調用Thread.sleep,另一個線程等待,直到第一個線程開始休眠,並用Thread.interrupt中斷它。

如何確保第二個線程在開始睡眠後中斷第一個線程?可能嗎 ?

+2

你有沒有嘗試過Thread.interrupt()? – BlackJoker

+0

好的。我看到我的問題不清楚。我知道我應該使用Thread.interrupt。問題是如何保證Tread.interrupt被調用_after_ Thread.sleep被調用。我在編輯這個問題。 – Michael

+0

請參閱http://stackoverflow.com/questions/15225579/what-will-happen-if-you-call-interrupt-on-a-sleeping-thread?rq=1 – Manish

回答

1

爲什麼在調用Thread.sleep後需要中斷?中斷被調用以使它的效果是相同的,無論它的調用時間是在調用sleep()之前還是之後。你想要測試它嗎?然後在一個循環中輪詢,直到線程TIMED_WAITING狀態得到:

t1.start(); 
while (t1.getState()!= Thread.State.TIMED_WAITING) { 
    Thread.sleep(10); 
} 
t1.interrupt(); 
+0

是的,這是一個測試。我只是想測試這個特殊情況。線程狀態輪詢聽起來像我所需要的。謝謝。 – Michael

3

您無法確定,因爲例如操作系統可能會決定在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(); 
+1

謝謝。我不喜歡「實踐中的小睡」,但我明白了你的觀點。 – Michael

+0

@Michael是的,我同意並且從不使用它們,但我沒有看到在睡眠中調用中斷的另一種方式......誠然,這不是一個常見的要求! – assylias

+0

並不是說它本身就是不可預測的...... 事實上,現在你的測試可能不是線程安全的,因爲它可能會中斷剛剛離開sleep(...)方法的Thread。我不會寫這樣的測試,因爲它可能會隨機失敗。 – JBert

1

使用同步器,並從臥鋪線程睡覺前通知其鎖定的斷續線。引入一個非常小的延遲(遠小於睡眠線程的睡眠時間),喚醒後在睡眠線程上發生中斷。