0

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

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

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

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

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


也在寻找一个实现:

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

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

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

基本上,我们可以尽可能确定地清理池,以便我们可以在应用程序容器中运行它。一些任务调用 selenium 等,因此可以挂起线程。

最后一道防线是重新启动容器(tomcat/jboss),但希望这是最后一道防线。

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

4

1 回答 1

1

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

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

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

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

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


顺便说一句,对于我来说,拥有多个ThreadPoolExecutors 并关闭它们而不是简单地ThreadPoolExecutor为所有作业设置一个并让它ThreadPoolExecutor管理所有线程的活动周期,这看起来很不自然。这就是它的ThreadPoolExecutor用途。

于 2013-09-27T17:20:47.143 回答