gpt4 book ai didi

java - 线程池 - 每个任务创建一个新线程,检测一组任务何时完成

转载 作者:行者123 更新时间:2023-12-01 14:04:16 26 4
gpt4 key购买 nike

通过 ThreadPoolExecutors 运行并发任务。由于我有 2-3 组任务要做,所以现在有一个 ThreadPoolExecutors 映射,并且可以将一组任务发送给其中一个。

现在想知道池何时完成分配给它的所有任务。它的组织方式是我事先知道任务列表,因此将它们发送到新建的池中,然后计划开始池化/跟踪以了解所有任务何时完成。

一种方法是使用另一个具有 1-2 个线程的池,轮询其他池以了解其队列何时为空。如果几次扫描显示它们为空(轮询之间有第二次 sleep ,假设它们已完成)。

另一种方法是子类 ThreadPoolExecutor ,通过队列进行跟踪并覆盖 afterExecute(Runnable r, Throwable t) 这样就可以准确地知道每个任务的时间已完成,如果一切进展顺利,可以很好地显示状态并知道一切何时完成。

第二个地方有实现吗?最好有一个监听器可以实现的接口(interface),然后将它们自己添加到子类方法中。

<小时/>

也在寻找实现:

  1. 要求池在超时时间内关闭,

  2. 如果超时后关闭未完成,则调用 shutdownNow()

  3. 如果失败,则获取线程工厂并停止其组中的所有线程。 (假设我们设置了工厂,并且它使用组或其他方式来获取对其所有线程的引用)

基本上,我们可以尽可能确定的方式来清理池,以便我们可以在应用程序容器中运行它。有些任务调用 selenium 等,因此可能会出现挂起的线程。

最后的办法是重新启动容器(tomcat/jboss),但希望这是最后的办法。

问题是 - 知道这个的开源实现或任何开始的代码吗?

最佳答案

对于第一个问题,您可以使用 ExecutorCompletionService 。它将把所有已完成的任务添加到 Queue 中。因此,使用阻塞队列,您可以等到所有任务都到达队列。

或者创建 FutureTask 的子类并覆盖其 done方法来定义“执行后”操作。然后将包装您的作业的此类实例提交给执行器。

第二个问题有一个简单的解决方案。 “在超时内关闭,如果超时后关闭未完成,则调用 shutdownNow()”:

executor.shutDown();
if(!executor.awaitTermination(timeout, timeUnit))
executor.shutdownNow();

停止线程是你不应该做的事情(Thread.stop 已被弃用是有充分理由的)。但您可以调用cancel(true)关于你的工作。如果您的任务支持中断,这可能会加速终止。

<小时/>顺便说一句,对我来说,拥有多个 ThreadPoolExecutor看起来非常不自然。并尝试关闭它们,而不是简单地拥有一个 ThreadPoolExecutor为所有工作并让其 ThreadPoolExecutor管理所有线程的生命周期。这就是 ThreadPoolExecutor专为。

关于java - 线程池 - 每个任务创建一个新线程,检测一组任务何时完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19056293/

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