启动多个线程并在所有子线程完成后在父线程上运行回调的非阻塞方法
如果您想在 PARENT 线程上进行回调,那么恐怕您需要让父线程调用exec.awaitTermination(...)
. 在你提交了所有的作业exec.shutdown()
并被调用之后,这会等待线程池中的所有作业完成。如果您希望它是非阻塞的,那么您将不得不在另一个线程中执行此操作(当然在不同的池中运行)。
我看不出它如何成为在非阻塞的父线程上运行的“侦听器”。您可以有一个后台线程检查,它将在完成时更新某种共享状态(如AtomicBoolean
)。true
exec.awaitTermination(...)
ThreadPoolExecutor
确实有terminate()
可以覆盖的方法。这不是你想要的吗?这是该方法的javadocs。您的代码将类似于:
ThreadPoolExecutor threadPool =
new ThreadPoolExecutor(10, 10, 0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue()) {
public void terminated() {
super.terminated();
// do something magic
}
};
threadPool.execute(task);
// ...
// need to shutdown the pool after you've submitted all of the tasks
threadPool.shutdown();
如果“神奇的东西”代码设置了一个共享volatile boolean
的或AtomicBoolean
主线程可以检查的,那么它应该可以正常工作。