Hi,
gibt es eine elegante Möglichkeit, Threads aufeinander warten zu lassen? Konkret: Ich habe zwei Threads. Der erste soll abgearbeitet werden und der zweite loslegen, sobald der erste fertig ist. Momentan habe ich das über einen dritten Thread gelöst, der die anderen beiden beobachtet und den zweiten startet, wenn der erste fertig ist. Der Watcher-Thread prüft einfach alle 200 ms auf thread1.isAlive() (es handelt sich um GUI-Animationen, die nacheinander ablaufen sollen). Das geht aber vermutlich eleganter, oder?
Du willst Threads synchronisieren, in deinem Fall nur 2. Für Synchronisation gibt es Mutexe/Semaphoren. Je nachdem was die Threads machen kann dir noch der Begriff kritischer Abschnitt weiterhelfen, und dann das Schlüsselwort synchronized.
Du kannst auch einen CountDownLatch verwenden: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html
Gib beiden Threads dieselbe Instanz eines CountDownLatches mit einem count-Wert von 1 mit und lasse den zweiten mittels await() darauf warten, dass der erste Thread nach Beendigung seiner Arbeit mittels countDown() den count-Wert des Latches auf 0 senkt.
Also eigentlich braucht man bei Animationen schon 2 Threads… der eine kopiert zyklisch den akuellen Frame in einen Buffer und signalisiert dem anderen, wenn er damit fertig ist. Der zweite zeigt derweil einen bereits gezeichneten Buffer an oder befindet sich im Wartezustand. Wie auch immer… der zweite Thread tauscht nun die Buffer aus und beide Threads beginnen gleichzeitig mit ihrer Arbeit von vorn. In Java kann der zweite Thread aber durchaus auch entfallen und statt dessen der EDT verwendet werden. Ein Animations-Thread reduziert sich dann auf:
long timeOut;
while(running) {
if(!paused) [
timeOut = animation.renderNextFrame();
if(timeOut < 1) {
running = false;
break;
}
} else {
timeOut = 10;
}
animView.repaint(timeOut); // das wäre die Stelle, wo Thread 2 benachrichtigt wird
try {
Thread.sleep(timeOut);
} catch(InterruptedException e) {
running = fasle;
}
}
}```
Naja... zumindest für Nacheinander gilt das bereits von EikeB erwähnte... Man braucht dazu keine 2 Threads.