我正在使用Executor框架使用线程池启动多个线程,即newFixedThreadPool.我使用threadpool.submit(aThread)来提交要由线程池执行的作业,这很好但是我需要确定所有线程何时完成,以便我可以继续进行其他处理.我看着使用Future.get()阻塞,直到线程完成,这里的问题是它阻塞直到结果可用.我还看了继续调用isTerminated()方法然后在发出关闭后调用睡眠以检查所有线程是否完整但这对我来说似乎并不整齐.还有另一种清洁方式吗?此外,如果在任何一个线程中引发异常,我希望能够终止所有其他正在运行的线程,并且还要阻止池中任何排队的线程启动.这样做的最佳机制是什么?
期待听到您的回复
TIA
解决方法:
解决此问题的一种更简洁的方法是修改提交的任务.通过向每个任务注册回调,它可以在没有主线程轮询的情况下通知正常完成或异常.
You can write a simple wrapper that will do this任何Runnable.
或者,在该示例之后,您可以扩展想法以包装任何Callable.
class CallbackTask<T>
implements Callable<T>
{
private final Callable<? extends T> task;
private final Callback<T> callback;
CallbackTask(Callable<? extends T> task, Callback<T> callback)
{
this.task = task;
this.callback = callback;
}
public T call()
throws Exception
{
try {
T result = task.call();
callback.complete(result);
return result;
}
catch (Exception ex) {
callback.failed(ex);
throw ex;
}
}
}