簡體   English   中英

如果線程已經忙,則使用newSingleThreadScheduledExecutor

[英]Working of newSingleThreadScheduledExecutor, if thread already busy

我的要求是創建一個服務,該服務在特定間隔后繼續檢查隊列並處理隊列中的元素。

對於10秒后的調度任務,我正在使用:

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

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

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

因此,在10秒后,再次調用runnable,它將停止上一個執行線程並啟動新線程。 或者,它將檢查線程是否已經在運行,如果它正在運行,那么在這種情況下它將跳過Runnable內部。

newSingleThreadScheduledExecutor(); 創建一個具有單個線程的執行程序,該線程永遠不會與現有線程並行執行任何操作。 它只有一個,並且線程一次不能執行多於一件事。

如果您的任務花費的時間超過10秒,它仍會在10秒后創建一個新任務,並將其放入等待完成的任務隊列中。 如果任務總是花費的時間超過您安排它們的速度,那么您將獲得一個不斷增長的任務隊列,並且可能在某些時候發生與內存相關的崩潰。

因此,在10秒后,再次調用runnable,它將停止上一個執行線程並啟動新線程。

它不會阻止任何事情。 執行者重新使用他們的線程。 線程執行您按順序提供給它的所有Runnable 因此,只要第一次完成,它就會執行下一個runnable。

或者,它將檢查線程是否已經在運行,如果它正在運行,那么在這種情況下它將跳過Runnable內部。

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

文檔解釋如下

如果此任務的執行時間超過其周期,則后續執行可能會延遲,但不會同時執行。

“非並發”部分適用於具有多個線程的執行程序。 這里不相關,因為那不可能發生。


如果您希望任務之間始終有10秒的延遲,請使用scheduleWithFixedDelay

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM