您需要兩個線程之間的一些同步機制。以下是我爲此使用CountDownLatch
的一個示例。我定義了一個SyncedThread
類,它在構造函數中傳入一個CountDownLatch
。
在主要方法中,我創建了這個類的兩個實例。首先,thread1
將運行2秒鐘,然後發出CountDownLatch信號,然後再進行一次虛擬睡眠3秒。 第二個實例thread2
將等待CountDownLatch,然後將休眠5秒模擬工作。
thread2.start()
方法首先被調用,然後用thread1.start()
500毫秒的延遲,但通過使用synchronisatio你會在實際thread2
等待thread1
輸出中看到。
public class ThreadStarterTest {
public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch(1);
SyncedThread thread1 = new SyncedThread(latch, "thread 1") {
@Override
public void run() {
try {
System.out.println(getName() + " running");
Thread.sleep(2_000);
latch.countDown();
Thread.sleep(3_000);
System.out.println(getName() + " finished");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
SyncedThread thread2 = new SyncedThread(latch, "thread 2") {
@Override
public void run() {
try {
latch.await();
System.out.println(getName() + " running");
Thread.sleep(5_000);
System.out.println(getName() + " finished");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
try {
thread2.start();
Thread.sleep(500);
thread1.start();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static class SyncedThread extends Thread {
private final CountDownLatch latch;
public SyncedThread(final CountDownLatch latch, final String name) {
super(name);
this.latch = latch;
}
}
}