2010-09-06 150 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