2014-01-29 50 views
4

我的要求是使這使在特定的時間間隔&過程後檢查隊列在隊列中的元素的服務。工作,如果線程已經忙

調度任務後10秒,我使用的是:

ScheduledExecutorService schd = Executors.newSingleThreadScheduledExecutor(); 
schd.scheduleAtFixedRate(readQueueRunnable, 10, 10, TimeUnit.SECONDS); 

我的問題是假設第一次,隊列中有許多元素和我的單個線程開始處理隊列中。

即使在10秒後我的第一個線程仍在執行它。

所以,當10秒後,可運行再次調用,將它停止先前執行的線程,並開始新的。 或者,它會檢查線程是否已經在運行&,如果它正在運行,那麼在這種情況下它將跳過Runnable內部。

+0

調度隊列檢查聽起來很奇怪,我只是用[BlockingQueue的#輪詢(超時)](HTTP: //docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html#poll%28long,%20java.util.concurrent。TimeUnit%29)在專用的消費者線程中 – zapl

回答

8

newSingleThreadScheduledExecutor();將創建一個線程,將永遠不會做任何事情在平行於現有線程的執行。它只有一個,線程一次不能執行超過1個事情。

如果你的任務超過10秒的時間較長,它仍然會在10秒後創建一個新的任務,並把它放在等待完成的任務的隊列。如果任務總是比您安排它們的速度更長,那麼您將獲得一個不斷增長的任務隊列,並且可能會在某個時刻出現與內存相關的崩潰。

因此,在10秒後,再次調用runnable時,它是否會停止前一個正在執行的線程並啓動新的線程。

它不會停止任何東西。執行者重新使用他們的線程。線程執行您按順序給出的所有Runnable。所以它會在第一次完成後簡單地執行下一個可運行的程序。

或者,它會檢查線程是否已經在運行&如果它正在運行,那麼它將跳過進入Runnable內部的情況。

它不會跳過10秒後創建任務。

documentation解釋它像

如果該任務的任一執行時間比其週期長,則後續執行可能起步晚,但不會同時執行。

「不同時」部分適用於具有多個線程的執行者。這不相關,因爲這不會發生。


如果您希望總有一個10秒延遲之間的任務,使用scheduleWithFixedDelay

+0

我可以向同一工作人員提供2種不同的可運行的程序嗎? – Jaydev

+0

@JaydevKalivarapu不確定你的意思,但你可以根據需要安排許多不同的runnables。 – zapl

相關問題