通过ThreadPoolExecutors运行并发任务。由于我有2-3组任务要做,现在有一个 ThreadPoolExecutors 的地图,可以向其中一个任务发送一组任务。
现在想知道池何时完成了分配给它的所有任务。它的组织方式是我事先了解任务列表,因此将它们发送到新构建的池中,然后计划开始汇集/跟踪以了解何时完成任务。
一种方法是使用另一个具有1-2个线程的池,轮询其他池以了解其队列何时为空。如果一些扫描显示它们为空(在轮询之间进行第二次睡眠,则假定它们已完成)。
另一种方法是子类ThreadPoolExecutor
,通过队列保留一个轨道并超越afterExecute(Runnable r, Throwable t)
因此可以确切知道每个任务何时完成,很好地显示状态并知道何时完成如果一切顺利的话。
第二部分是否有实施?最好有一个监听器可以实现的接口,然后将它们自己添加到子类方法中。
同时寻找实施方案:
要求游泳池在一段时间内关闭,
如果超时后关闭未完成,请致电shutdownNow()
如果失败则获取线程工厂并停止其组中的所有线程。 (假设我们设置工厂并使用组或其他方式获取对其所有线程的引用)
基本上尽可能确保清理池,以便我们可以在app容器中运行它。一些任务调用selenium等,因此可以挂起线程。
最后一个问题是重启容器(tomcat / jboss),但希望这是最后一个沟渠。
问题是 - 知道这个或任何代码的开源实现开始?
答案 0 :(得分:1)
对于第一个问题,您可以使用ExecutorCompletionService
。它会将所有已完成的任务添加到Queue
中,因此使用阻塞队列可以等到所有任务到达队列。
或者创建FutureTask
的子类并覆盖其done
方法以定义“执行后”操作。然后将此类的实例提交给执行者。
第二个问题有一个简单的解决方案。 “在一段时间内关闭,如果超时后关闭未完成,则调用shutdownNow()”:
executor.shutDown();
if(!executor.awaitTermination(timeout, timeUnit))
executor.shutdownNow();
停止线程是你不应该做的事情(Thread.stop
因为一个充分的理由而被弃用)。但是你可以在你的工作上调用cancel(true)
。如果您的任务支持中断,这可能会加速终止。
<小时/> 顺便说一句,对于我有多个
ThreadPoolExecutor
并且正在关闭它们而不是简单地为所有工作只有一个ThreadPoolExecutor
而让ThreadPoolExecutor
管理现场周期的工作看起来非常不自然所有线程。这就是ThreadPoolExecutor
的用途。