Java,ThreadPoolExecutor,afterExecute,重新提交任务?

时间:2012-06-21 10:41:34

标签: java multithreading

我需要再次将正确完成的任务执行到队列(某种循环)。是否可以覆盖afterExecute方法并只调用getQueue()。offer(runnable); ?我担心线程同步,谢谢。

2 个答案:

答案 0 :(得分:3)

执行程序可以运行不同的任务,而不仅仅是您想要重复的任务。因此,在重写的afterExecute方法中,您应该确定完成的任务是否是要重复的任务。结果,执行者知道特定任务。这是一个糟糕的设计,INHO。

考虑使用ScheduledThreadPoolExecutor.scheduleWithFixedDelay()。但是,它要求延迟> 0,但您可以将延迟设置为1纳秒。

另一个选项(我更喜欢)是将您的任务包装在另一个Runnable中,如果嵌套任务正确完成,它将重新提交。

答案 1 :(得分:1)

你的建议应该没有问题。但是,请勿调用getQueue().offer(),而只需在执行程序服务上调用submit()。另外,由于afterExecute是受保护的方法,我假设您创建了一个ThreadPoolExecutorService的子类?请务必使用super.afterExecute()方法拨打afterExecute

就个人而言,我喜欢提交者类的想法,该类负责将Runnables放在服务上。使用回调在执行完成时通知提交者(可能使用Callable而不是Runnable),并且提交者确定是否应重新提交任务。这可以很好地解决前瞻性问题。

最后,@ Alexei的建议可能是一个很好的建议,可以考虑作为子类化ThreadPoolExecutorService的更标准的替代方案。