2

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

4

2 回答 2

3

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

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

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

于 2012-06-21T11:00:49.197 回答
1

你的提议应该没有问题。但是,不要调用getQueue().offer(),而只是调用submit()executor 服务。另外,由于afterExecute是受保护的方法,我假设您已经创建了一个子类ThreadPoolExecutorService?一定要调用super.afterExecute()你的afterExecute方法。

就个人而言,我喜欢负责将 Runnables 放在服务上的提交者类的想法。执行完成时使用回调通知提交者(可能使用 aCallable而不是 a Runnable)并且提交者确定是否应重新提交任务。这可以很好地隔离潜在的关注点。

最后,@Alexei 的建议可能是很好的建议,可以作为 subclassing 的更标准替代方案ThreadPoolExecutorService

于 2012-06-21T11:18:18.773 回答