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