Sie benötigen einen Synchronisationsmechanismus zwischen den beiden Threads. Unten ist ein Beispiel, wo ich eine CountDownLatch
für diesen Zweck verwende. Ich definierte eine Klasse SyncedThread
, die eine CountDownLatch
im Konstruktor übergeben bekommt.
In der Hauptmethode erstelle ich dann zwei Instanzen dieser Klasse. Die erste, thread1
, wird 2 Sekunden lang ausgeführt, dann wird CountDownLatch signalisiert und dann für weitere 3 Sekunden ein Dummy-Schlaf ausgeführt. Die zweite Instanz thread2
wartet auf den CountDownLatch und wird dann 5 Sekunden lang arbeiten, um Arbeit zu simulieren.
thread2.start()
Methode wird zuerst genannt wird, dann ist die thread1.start()
mit einer Verzögerung von 500ms, sondern durch die synchronisatio Verwendung finden Sie in der Ausgabe zu sehen, die tatsächlich thread2
für thread1
wartet.
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;
}
}
}