我认为你不需要观察者模式.线程等待任何结果将不得不阻止,否则它将完成或循环无穷大.你可以使用某种BlockingQueue – 生成器会将计算结果添加到阻塞队列(然后完成),主线程只会在没有任何结果的情况下接收这些结果.
对你好消息,它已经实现了:) CompletionService和Executors框架的很好的机制.试试这个:
private static final int NTHREADS = 5;
private static final int NTASKS = 100;
private static final ExecutorService exec = Executors.newFixedThreadPool(NTHREADS);
public static void main(String[] args) throws InterruptedException {
final CompletionService ecs = new ExecutorCompletionService(exec);
for (final int i = 0; i < NTASKS ; ++i) {
Callable task = new Callable() {
@Override
public Long call() throws Exception {
return i;
}
};
ecs.submit(task);
}
for (int i = 0; i < NTASKS; ++i) {
try {
long l = ecs.take().get();
System.out.print(l);
} catch (ExecutionException e) {
e.getCause().printStackTrace();
}
}
exec.shutdownNow();
exec.awaitTermination(50, TimeUnit.MILLISECONDS);
}