2009-12-29 59 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(); 

對於每次迭代可能是確保其他線程獲得一個最簡單的方法機會執行。