如何等待ThreadPoolExecutor完成


问题内容

我的问题:
如何在a上执行一堆线程对象ThreadPoolExecutor并等待它们全部完成后再继续?

我是ThreadPoolExecutor的新手。因此,此代码是测试以了解其工作方式。现在我什至都不用BlockingQueue对象填充,因为我不理解如何在不调用execute()另一个队列的情况下开始队列RunnableObject。无论如何,现在我只是打电话给我,awaitTermination()但我认为我仍然缺少一些东西。任何提示都很棒!谢谢。

public void testThreadPoolExecutor() throws InterruptedException {
  int limit = 20;
  BlockingQueue q = new ArrayBlockingQueue(limit);
  ThreadPoolExecutor ex = new ThreadPoolExecutor(limit, limit, 20, TimeUnit.SECONDS, q);
  for (int i = 0; i < limit; i++) {
    ex.execute(new RunnableObject(i + 1));
  }
  ex.awaitTermination(2, TimeUnit.SECONDS);
  System.out.println("finished");
}

RunnableObject类:

package playground;

public class RunnableObject implements Runnable {

  private final int id;

  public RunnableObject(int id) {
    this.id = id;
  }

  @Override
  public void run() {
    System.out.println("ID: " + id + " started");
    try {
      Thread.sleep(2354);
    } catch (InterruptedException ignore) {
    }
    System.out.println("ID: " + id + " ended");
  }
}

问题答案:

你应该循环 awaitTermination

ExecutorService threads;
// ...
// Tell threads to finish off.
threads.shutdown();
// Wait for everything to finish.
while (!threads.awaitTermination(10, TimeUnit.SECONDS)) {
  log.info("Awaiting completion of threads.");
}