1

我正在使用 ExecutorService 执行 n 个Runnable任务(不可调用)。

我想等待所有任务完成。

我不能使用invokeAll- 因为它适用于 Callables 的集合。

我不能使用shutdown()+awaitTermination,因为 awaittermination 需要提供一个超时时间,但我的任务可能需要几个小时才能完成。

我可以用:

ExecutorService.shutdown();             
while (!ExecutorService.isTerminated()) {}

但是这个循环总是会被触发。

在这种情况下有什么建议?

4

3 回答 3

4

ExecutorService.awaitTermination()返回一个boolean指示执行程序是否终止或超时已过的 a。您当然可以循环调用它:

ExecutorService executor = ...;

executor.shutdown();
while (!executor.awaitTermination(24L, TimeUnit.HOURS)) {
    System.out.println("Still waiting for the executor to finish");
}

System.out.println("Executor finished");
于 2013-05-02T07:14:39.043 回答
2

您可以使用ExecutorService.awaitTermination(Long.MAX_VALUE, TimeUnit.HOURS);

于 2013-05-02T06:30:27.690 回答
1

对于已知数量的任务,CountDownLatch非常完美,但在某些情况下,当您不知道自己将拥有多少任务时,在这种情况下,我使用Semaphore。例如:

    Semaphore s =new Semaphore(0);
    while(..){
     if (isLastTask){
         taskExecutor.execute(new Task(s));
     } else 
         taskExecutor.execute(new Task());
    }
    s.acquire(1);

class Task implement implements Runnable {
   Semaphore s;

   public Task(){
     this(null);
   }

   public Task (Semaphore s){
     this.s = s;
   }

   public void run(){
       ......
      if ( s != null )
          s.release();
   }
}
于 2015-03-20T06:57:55.390 回答