簡體   English   中英

如何在Java中同步Thread.sleep和Thread.interrupt?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM