2013-09-27 68 views
0

通过ThreadPoolExecutors运行并发任务。由于我有2-3组任务要做,因此现在有一个ThreadPoolExecutors的地图,并且可以将一组任务发送给其中一个任务。线程池 - 为每个任务创建一个新的任务,检测完成一组任务

现在想知道当池已完成分配给它的所有任务。它的组织方式是我在掌握任务清单之前知道的,因此将它们发送到新构建的池中,然后计划开始合并/跟踪以了解何时完成所有任务。

一种方法是有另一个池1-2线程,即轮询其他池知道什么时候他们的队列为空。如果一些扫描显示它们为空(在轮询之间第二次睡眠,假设它们已完成)。

另一种方法是子类ThreadPoolExecutor,保持跟踪通过队列,并在摆脱afterExecute(Runnable r, Throwable t)这样可以确切地知道每个任务完成后,良好的显示状态,并知道什么时候都是完整的,如果一切顺利的移动。

有没有第二个的实现在哪里?有一个听众可以实现的接口会很好,然后将它们自己添加到子分类方法中。


也在寻找一个实现:

  1. 要问一个池超时内关闭,

  2. 如果一段时间后出关停不完整则叫shutdownNow()

  3. 如果失败则获得线程工厂,并停止所有线程的组。 (假设我们设定的工厂,它使用一组或其他方式来获得一个参考,以它的线程)

基本上是以肯定的方式就可以了,清理水池,使我们可以有这在一个应用程序容器中运行。一些任务调用硒等,所以可以挂起线程。

最后沟将重新启动容器(Tomcat的/ JBoss的),但希望这种情况是不得已而为之。

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

回答

1

关于第一个问题,你可以使用一个ExecutorCompletionService。它会将所有已完成的任务添加到Queue中,因此通过阻塞队列可以等待所有任务到达队列。

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

第二个问题有一个简单的解决方案。 “超时内关闭,如果超时后关闭不彻底,然后调用shutdownNow时()”:

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

停止线程的东西,你不应该这样做(Thread.stop已经废弃了的好原因)。但你可以在你的工作上调用cancel(true)。如果你的任务支持中断,这可能会加速终止。


顺便说一句,它看起来非常不自然对我来说有多个 ThreadPoolExecutor S和与关闭它们,而不是仅仅具有所有作业一个 ThreadPoolExecutor并让那 ThreadPoolExecutor管理所有线程的使用生命周期玩耍。这就是 ThreadPoolExecutor

+0

谢谢你Holger。我可以将它们全部放在一个池中,但许多优点是不同的客户端可以使用一个池,我可以为每个池设置一个线程的限制,因此一个客户端不会占用太多的资源。这是思路。这样可以关闭一个池而不影响其他池。 – tgkprog

+0

Thread.stop是最后一招 - >像selenium这样的外部API连接到浏览器/外部UI并且不能依赖是我在过去两个月中看到的。 – tgkprog

相关问题