【发布时间】:2012-06-23 13:59:57
【问题描述】:
我需要再次对队列执行正确完成的任务(某种循环)。是否可以重写 afterExecute 方法并调用 getQueue().offer(runnable); ?我担心线程同步,谢谢。
【问题讨论】:
标签: java multithreading
我需要再次对队列执行正确完成的任务(某种循环)。是否可以重写 afterExecute 方法并调用 getQueue().offer(runnable); ?我担心线程同步,谢谢。
【问题讨论】:
标签: java multithreading
一个执行者可以运行不同的任务,而不仅仅是你想要重复的那个。因此,在覆盖的 afterExecute 方法中,您应该确定完成的任务是否是要重复的任务。结果,执行者知道特定的任务。这是一个糟糕的设计,INHO。
考虑使用 ScheduledThreadPoolExecutor.scheduleWithFixedDelay()。但是,它要求延迟>0,但您可以将延迟设置为 1 纳秒。
另一个选项(我更喜欢)是将您的任务包装在另一个 Runnable 中,如果嵌套任务正确完成,它将重新提交自身。
【讨论】:
您的建议应该没有问题。但是,不要调用getQueue().offer(),而只需在执行程序服务上调用submit()。另外,由于afterExecute 是受保护的方法,我假设您已经创建了ThreadPoolExecutorService 的子类?请务必在您的 afterExecute 方法中调用 super.afterExecute()。
就个人而言,我喜欢提交者类的想法,该类负责将 Runnables 放在服务上。执行完成时使用回调通知提交者(可能使用Callable 而不是Runnable),提交者确定是否应重新提交任务。这可以很好地隔离潜在的关注点。
最后,@Alexei 的建议可能是很好的建议,可以作为子类化ThreadPoolExecutorService 的更标准替代方案。
【讨论】:
Runnable 转换为允许检索状态并进行检查的其他类类型。这会起作用,但不是我认为的最佳解决方案。这是Callable 和Future 的目的,但它们确实需要额外的线程来监控Futures