我需要再次将正确完成的任务执行到队列(某种循环)。是否可以覆盖afterExecute方法并只调用getQueue()。offer(runnable); ?我担心线程同步,谢谢。
答案 0 :(得分:3)
执行程序可以运行不同的任务,而不仅仅是您想要重复的任务。因此,在重写的afterExecute方法中,您应该确定完成的任务是否是要重复的任务。结果,执行者知道特定任务。这是一个糟糕的设计,INHO。
考虑使用ScheduledThreadPoolExecutor.scheduleWithFixedDelay()。但是,它要求延迟> 0,但您可以将延迟设置为1纳秒。
另一个选项(我更喜欢)是将您的任务包装在另一个Runnable中,如果嵌套任务正确完成,它将重新提交。
答案 1 :(得分:1)
你的建议应该没有问题。但是,请勿调用getQueue().offer()
,而只需在执行程序服务上调用submit()
。另外,由于afterExecute
是受保护的方法,我假设您创建了一个ThreadPoolExecutorService
的子类?请务必使用super.afterExecute()
方法拨打afterExecute
。
就个人而言,我喜欢提交者类的想法,该类负责将Runnables放在服务上。使用回调在执行完成时通知提交者(可能使用Callable
而不是Runnable
),并且提交者确定是否应重新提交任务。这可以很好地解决前瞻性问题。
最后,@ Alexei的建议可能是一个很好的建议,可以考虑作为子类化ThreadPoolExecutorService
的更标准的替代方案。