通过ThreadPoolExecutors运行并发任务。由于我要执行2-3套任务,因此现在有了ThreadPoolExecutors的映射,可以将一组任务发送给其中一个。
现在想知道一个池何时完成分配给它的所有任务。它的组织方式是我事先知道任务列表,因此将它们发送到新构建的池中,然后计划开始池化/跟踪以了解何时完成所有任务。
一种方法是让另一个池具有1-2个线程,该池轮询其他池以了解其队列何时为空。如果几次扫描显示它们为空(在两次轮询之间有第二次睡眠,则假定它们已完成)。
另一种方法是对ThreadPoolExecutor
进行子类化,通过队列并跳过afterExecute(Runnable r, Throwable t)
进行跟踪,因此可以准确地知道每个任务的完成时间,很好地显示状态,并知道一切顺利进行时什么时候完成。
第二个实现在哪里实现?拥有一个侦听器可以实现的接口,然后将它们自己添加到子类方法中将是很好的。
也正在寻找实现:
要要求某个池在超时内关闭,
如果超时后关闭仍未完成,请致电shutdownNow()
如果失败,则获取线程工厂并停止其组中的所有线程。 (假设我们设置了工厂,并且它使用组或其他方式来获取对其所有线程的引用)
基本上可以肯定的方式来清理池,以便可以在应用程序容器中运行它。有些任务调用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
的作用。