簡體   English   中英

喚醒使用 ScheduledExecutorService 生成的線程

[英]Wake up a thread spawned using ScheduledExecutorService

我正在使用 ScheduledExecutorService 生成一個線程,如下所示:

    private ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
    private ScheduledFuture<?> scheduledFuture = ses.scheduleWithFixedDelay(() -> { cleanup(); }, 0L, 5L, TimeUnit.SECONDS);

在執行清理 function 之間有 5 秒的睡眠。

在某些情況下,是否有規定喚醒此線程以開始運行清理,而不是等待 5 秒觸發它?

示例:在時間 T1 -> 調用清理,在 T1+2s -> 我想喚醒線程以進行明確的清理

我想喚醒線程來明確地進行清理。

為什么不簡單地從任何其他線程看到需要調用cleanup()呢?

void someTerriblyImportantFunction(...) {
    ...
    if (thisPlaceNeedsToBeCleanedUp_Like_NOW()) {
        cleanup();
    }
    ...
}

我可以這樣做,但我希望線程始終運行清理。

首先,你不能依賴線程池在執行你的清理任務時總是使用同一個線程。 您通過調用Executors.newScheduledThreadPool(1)創建了池,但1參數僅指定池中的最小線程數。 在將同一個線程池用於不止一件事的程序中,該池可以根據需要自由地創建和銷毀工作線程,只要它始終保持一個線程就緒。

其次,這只是我個人的觀點,設計多線程程序是一種很好的做法,即無論何時需要執行某些任務,哪個線程執行它都無關緊要。 在這種情況下,我會設計cleanup()以便可以隨時從任何線程安全地調用它。


PS,還要注意@Hulk 在評論中所說的話:如果cleanup()花費的時間比調用者願意等待的時間長,那么另一種選擇是提交一個“一次性”任務以盡快安排同一個線程池。

void someTerriblyImportantFunction(...) {
    ...
    if (thisPlaceNeedsToBeCleanedUp_RealSoon()) {
        ses.schedule(() -> { cleanup(); }, 1L, TimeUnit.MICROSECONDS);
    }
    ...
}

暫無
暫無

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

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