2009-09-16 61 views
3

我正在使用Executor框架使用线程池(例如newFixedThreadPool)启动多个线程。我使用threadpool.submit(aThread)提交要由线程池执行的作业,并且此工作正常,但是我需要确定所有线程何时完成,以便我可以继续进行其他处理。我看着使用Future.get()来阻塞,直到线程完成,这里的问题是阻塞直到结果可用。我还着眼于在发出关闭之后不断调用isTerminated()方法并随后进入睡眠状态,以检查所有线程是否完整,但这对我来说似乎并不整齐。有没有另一种更清洁的方法呢?此外,如果在任何一个线程中发生异常,我希望能够终止所有其他正在运行的线程,并且还可以停止启动池中的任何排队线程。什么是最好的机制来做到这一点?知道所有线程何时完成并处理异常

敬候您的答复

TIA

回答

1

解决这个问题的更简单方法之一是修改提交的任务。通过为每个任务注册一个回调,它可以通知主线程没有任何轮询的正常完成或异常。

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; 
    } 
    } 

} 
7

使用ExecutorService#shutdown()然后ExecutorService#awaitTermination()

例如:

ExecutorService service = Executors.newCachedThreadPool(); 
service.submit(...); 
service.submit(...); 
service.shutdown(); 
service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS); 

// All tasks have now finished 

至于通知您,当一个任务失败,异常。您必须向ExecutorService提供一个ThreadFactory,它为其创建的每个线程设置“未捕获异常处理程序”。此异常处理程序可以终止正在运行的任务。

相关问题