首页 文章

知道所有线程何时完成并处理异常

提问于
浏览
3

我正在使用Executor框架使用线程池启动多个线程,即newFixedThreadPool . 我使用threadpool.submit(aThread)来提交要由线程池执行的作业,这很好但是我需要确定所有线程何时完成,以便我可以继续进行其他处理 . 我看着使用Future.get()阻塞直到线程完成这里的问题是它阻塞直到结果可用 . 我还看到在发出关闭后继续调用isTerminated()方法然后调用sleep来检查是否所有线程都已完成,但这对我来说似乎并不整齐 . 还有另一种清洁方式吗?此外,如果在任何一个线程中引发异常,我希望能够终止所有其他正在运行的线程,并且还要阻止池中任何排队的线程启动 . 这样做的最佳机制是什么?

期待听到您的回复

TIA

2 回答

  • 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,为其创建的每个线程设置"uncaught Exception handler" . 然后,此异常处理程序可以终止正在运行的任务 .

相关问题