2009-12-29 63 views
2

我有这个问题。Java:以指定的时间间隔执行方法

如果可能的话,我需要有一个重复不断的方法,但不会超载系统。

据我所知,while(true){... code ...}会挂起系统。

你会建议我使用哪些不会挂起系统的东西?

感谢

另外: 一个我的方法可能需要长达5分钟,或50毫秒的执行,我想方法,当它完成

回答

1

你可以开始一个新的线程并在后台运行任务。有关更多信息,请参阅Java concurrency教程。

如果您只想一次为此任务运行1个线程,则可以使用single thread executor

+0

我可以用while(true){...}代码开始一个新线程,它不会影响主程序(不会挂起它)吗? – Andrey 2009-12-29 04:14:34

+0

是的,它不会挂起它 - 新线程与主线程同时运行。你开始新的线程,它会运行直到它自己完成,或者直到你的主线程停止它。 – 2009-12-29 04:17:30

+0

我应该开始什么样的线程?你能告诉我一小段代码吗 – Andrey 2009-12-29 04:21:18

1

您可以使用任何计划要重复仅仅指刚。

例如QUARTZ是一个很好的。

+0

当一个runnable未完成时(例如,需要大约5分钟才能完成),计划似乎会创建一个新线程。我不希望它创建一个新的线程,我只希望它在方法完成时做到这一点 – Andrey 2009-12-29 04:15:33

+0

然后我猜Executor是你正在寻找的类。您可以创建一个线程池。指定总线程数等于1,你会得到你想要的。 – Rites 2009-12-29 04:25:53

+0

执行者是一流的。我错过了那边的S。 – Rites 2009-12-29 04:32:42

3

看看Timer和TimerTask。他们正是你需要的。

编辑: 仍然你需要什么。看看API的

+0

但是,当一个时间任务未完成时(例如,需要大约5分钟才能完成),似乎会创建一个新线程。我不希望它创建一个新线程,我只希望它在方法完成时执行此操作。 – Andrey 2009-12-29 04:13:07

+0

恐怕您没有太多选项。如果有另一种方式,我很乐意听到它。最好有一个单独的定时器调度线程满足您的所有需求(而不是在单独的线程上运行您的任务),以尽量减少线程数量。 – 2009-12-29 04:15:28

0

如果您希望在第一次完成后立即开始新的重复,则不需要调度程序,并在同一个线程上执行。 “虽然(真)”正是这样做的方式,如果这实际上是你想要的。

您对“挂起系统”的担忧表明,在程序中的其他线程上发生了其他事情,您希望允许发生这种情况,或者希望在某种情况下结束这个序列, t指定

在第二种情况下,您需要在while循环中测试终止条件而不是“while true”(或使用“break”)。在第一种情况下,您需要确保其他线程能够访问CPU。调用

Thread.currentThread().yield(); 

对于每次迭代可能是确保其他线程获得一个最简单的方法机会执行。