Возможно, вы захотите взглянуть на пакет java.util.concurrent
. В частности, вы можете рассмотреть возможность использования CountDownLatch
как в
package de.grimm.game.ui;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args)
throws Exception {
final ExecutorService executor = Executors.newFixedThreadPool(5);
final CountDownLatch latch = new CountDownLatch(3);
for( int k = 0; k < 3; ++k ) {
executor.submit(new Runnable() {
public void run() {
// ... lengthy computation...
latch.countDown();
}
});
}
latch.await();
// ... reached only after all threads spawned have
// finished and acknowledged so by counting down the
// latch.
System.out.println("Done");
}
}
Очевидно, что этот метод будет работать, только если вы заранее знаете количество разветвленных нитей, поскольку вам нужно инициализировать защелку с этим числом.
Другой способ - использовать условные переменные, например:
boolean done = false;
void functionRunInThreadA() {
synchronized( commonLock ) {
while( !done ) commonLock.wait();
}
// Here it is safe to set the variable to null
}
void functionRunInThreadB() {
// Do something...
synchronized( commonLock ) {
done = true;
commonLock.notifyAll();
}
}
Возможно, вам потребуется добавить обработку исключений (InteruptedException
) и некоторые другие.