gpt4 book ai didi

java - 启动多个线程并在所有子线程完成后在父线程上运行 callabck 的非阻塞方法

转载 作者:行者123 更新时间:2023-11-29 05:37:00 25 4
gpt4 key购买 nike

主要是回调应该在父线程上,而不是从完成工作的任务中调用(例如,不像 ThreadPoolExecutor 的 afterExecute() Hook )。我想要这样的东西:

ExecutorService exec = Executors.newSingleThreadExecutor();
>>>>> exec.addAllJobsFinishedListener(someListener) <<<<<
exec.submit(task);

和 someListener 有一个像 allJobsFinished() 这样的 Overrideable 方法

最佳答案

Non-blocking method to start several threads and run a callback on the parent thread when all children have finished

如果你想在父线程上回调,恐怕你需要让父线程调用exec.awaitTermination(...)。在您提交所有作业并调用 exec.shutdown() 之后,这将等待线程池中的所有作业完成。如果您希望这是非阻塞的,那么您将不得不在另一个线程中执行此操作(当然是在不同的池中运行)。

我不明白它如何成为在也是非阻塞的父线程上运行的“监听器”。您可以进行后台线程检查,当 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,那么它应该可以正常工作。

关于java - 启动多个线程并在所有子线程完成后在父线程上运行 callabck 的非阻塞方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19145760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com