2010-09-06 101 views
1

我有一个需要按计划执行的任务。 (它基本上轮询数据库寻找变化,然后根据结果执行代码)。问题是我需要轮询的任务发生,即使它已经在执行。Java线程任务的并发执行

到目前为止,我已经尝试使用scheduleAtFixedRate()方法和带有scheduleAtFixedRate()方法的ScheduledThreadPoolExecutor/Thread组合与Timer/TimerTask组合。

都在等待当前计划的任务完成后才能运行下一个。我需要能够安排任务每5秒运行一次,并在任务的最后一次执行尚未完成时运行。

任何想法?

回答

3

如何使用Timer作为“启动”计时器,然后使用单独的线程池执行:当计时器滴答时,您将任务提交给线程池以立即执行。 (你可能想要调整线程池以使一些最大数量的任务同时运行。)

+0

这是工作,但如果其中一个线程从池中产生一个异常(即使我赶上它)它似乎取消“启动”定时器并阻止它轮询。 – Tom 2010-09-06 11:10:47

+0

@Tom:这看起来不太可能,因为到那时它将处于不同的线程。如果您可以提供一个简短但完整的程序来证明问题,那将有所帮助。 – 2010-09-06 11:25:18

+0

我刚刚意识到是什么导致了这个问题。实际上,当一个异常引发了外观已挂起的异常时,我并未从活动线程列表中删除该线程。谢谢你的帮助! :) – Tom 2010-09-06 11:33:46