我在用着java.util.concurrent.ExecutorService with 固定线程池执行任务列表。我的任务列表通常约为 80 - 150 个,并且我将任何时间运行的线程数限制为 10 个,如下所示:
ExecutorService threadPoolService = Executors.newFixedThreadPool(10);
for ( Runnable task : myTasks )
{
threadPoolService.submit(task);
}
我的用例要求即使已完成的任务也应该重新提交给执行服务但只有当所有的already提交的任务已得到服务/完成。也就是说,提交的任务基本上应该轮流执行。因此,也不会有threadPoolService.shutdown()
or threadPoolService.shutdownNow()
在这种情况下请致电。
我的问题是,我该如何实施执行服务服务轮换基础任务?
ThreadPoolExecutor 为 afterExecution 提供了一个扩展点,您可以在其中将作业放回到队列的末尾。
public class TaskRepeatingThreadPoolExecutor extends ThreadPoolExecutor {
public TaskRepeatingThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
this.submit(r);
}
}
当然,您需要做更多的工作来自己实例化它,而无需借助ExecutorService
很方便的工厂方法,但构造函数很简单,很容易理解。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)