我有一個TimerTask它旨在收集特定時間間隔的指標。然而,任務執行的週期可能小於任務執行的時間(有時如果超時並延遲)。Java中計劃任務的併發執行
有沒有辦法同時執行多個TimerTasks或Runnables,線程等等,而無需等待上一個任務完成?
我知道Timer使用單個線程,並且ScheduledThreadPoolExecutor將延遲執行,無論速率如何。
謝謝。
我有一個TimerTask它旨在收集特定時間間隔的指標。然而,任務執行的週期可能小於任務執行的時間(有時如果超時並延遲)。Java中計劃任務的併發執行
有沒有辦法同時執行多個TimerTasks或Runnables,線程等等,而無需等待上一個任務完成?
我知道Timer使用單個線程,並且ScheduledThreadPoolExecutor將延遲執行,無論速率如何。
謝謝。
我會建議你使用Executors.newCachedThreadPool()
或newCachedThreadPool(ThreadFactory threadFactory)
與你自己的線程工廠,結合計時器。所以代碼應該看起來像這樣
Executor executor = Executors.newCachedThreadPool();
Timer time = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
executor.execute(new Runnable() {
public void run() {
//your business logic
}
});
}
}, delay, period);
這樣你就可以安排一段時間的任務,它們都會同時運行。
明白了......謝謝!如果有人可以解釋這是如何工作的,而不是Timer方法或Scheduler方法,那麼我會很感激這些知識。本質上是如何繞過阻塞。 – 0G0
原因是計時器有它自己的線程,而這個線程所做的唯一事情就是將任務分配給'CachedThreadPool',然後在單獨的線程中幾乎運行每個新任務。我希望我清楚地說明:)你可以問更多,如果你不明白的東西 – Desert
好吧,顯然這沒有工作...我不知道發生了什麼...我用上面的代碼,似乎如果線程B在線程A之前完成,然後定時器「趕上」並快速連續地觸發其他線程。我查看了我的runnables上的時間戳,並且我有14個對象都具有相同的時間戳。此時我不知所措。 – 0G0
使用任何Timer實現(包括ScheduledThreadPoolExecutor),但讓您的計時器任務不執行您的業務邏輯,而是快速啓動另一個任務(緩存的線程池或其自己新創建的線程),實際上它會執行大量計算。
那麼你能解釋一下爲什麼'ScheduledThreadPoolExecutor.scheduleAtFixedRate(..)'不適合你的需要嗎? – Desert
根據API和我的測試使用它... _「如果此任務的任何執行需要比其時間更長的時間,則後續執行可能會遲到,但不會同時執行。」_來自[Java API](http ://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html) – 0G0