3

这是我的代码片段。

ExecutorService executor = Executors.newFixedThreadPool(ThreadPoolSize);
while(conditionTrue)
{
ClassImplementingRunnable c = new ClassImplementingRunnable();
executor.submit(c);
}

现在完成后

executor.shutdown();

我想在这里实现的是我想等待线程池中的所有线程都完成执行,然后我想关闭执行器。

但我想这不是这里发生的事情。主线程似乎正在执行关闭,它只是关闭了一切。

在我的线程池大小为 2 之前,我做了以下操作,它似乎工作。

ClassImplementingRunnable c1 = new ClassImplementingRunnable();
executor.submit(c1);
ClassImplementingRunnable c2 = new ClassImplementingRunnable();
executor.submit(c2);
Future f1 = executor.submit(c1);
Future f2 = executor.submit(c2);
while(!f1.done || !f2.done)
{}
executor.submit();

我如何为线程池中的更多线程执行此操作?谢谢。

4

3 回答 3

14

您通常使用以下成语:

executor.shutdown();
executor.awaitTermination(Integer.MAX_VALUE, TimeUnit.SECONDS);
  • shutdown只是说执行者不会接受新工作。
  • awaitTermination等到所有已经提交的任务完成他们正在做的事情(或者直到超时 - 这不会发生在 Integer.MAX_VALUE - 你可能想要使用较低的值)。
于 2012-08-30T09:12:31.130 回答
8

shutdown是一个“软”命令,不会突然关闭执行程序。它会做你想做的事:拒绝任何新任务,等待所有提交的任务完成,然后关闭。

添加awaitTermination到您的代码中以阻止执行程序服务关闭。

文档中,还有涵盖所有角度的代码:

void shutdownAndAwaitTermination(ExecutorService pool) {
   pool.shutdown(); // Disable new tasks from being submitted
   try {
     // Wait a while for existing tasks to terminate
     if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
       pool.shutdownNow(); // Cancel currently executing tasks
       // Wait a while for tasks to respond to being cancelled
       if (!pool.awaitTermination(60, TimeUnit.SECONDS))
           System.err.println("Pool did not terminate");
     }
   } catch (InterruptedException ie) {
     // (Re-)Cancel if current thread also interrupted
     pool.shutdownNow();
     // Preserve interrupt status
     Thread.currentThread().interrupt();
   }
 }
于 2012-08-30T09:12:20.640 回答
0

我想在这里实现的是我想等待线程池中的所有线程都完成执行,然后我想关闭执行器。

就是executor.shutdown();这样。如果要立即关闭,则需要使用shutdownNow()

于 2012-08-30T09:12:46.530 回答