唤醒使用scheduledexecutorservice生成的线程

r6hnlfcb  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(332)

我正在使用scheduledexecutorservice生成一个线程,如下所示:

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

在执行cleanup函数之间有5秒钟的睡眠时间。
在某些情况下,是否有唤醒此线程以开始运行清理而不是等待5秒来触发它的规定?
示例:在调用t1->cleanup时,在t1+2s->我想唤醒线程来显式地进行清理

vbopmzt1

vbopmzt11#

我想唤醒线程来进行清理。
为什么不直接打电话 cleanup() 从任何其他线程看到的需要?

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

我可以这样做,但我希望线程总是运行清理。
首先,当线程池执行清理任务时,不能依赖它总是使用同一个线程。您通过调用 Executors.newScheduledThreadPool(1) ,但是  1 参数仅指定池中的最小线程数。在将同一线程池用于多个任务的程序中,只要池始终保持一个线程就绪,就可以根据需要自由创建和销毁工作线程。
其次,这只是我个人的观点,以这样的方式设计多线程程序是一种很好的做法:每当需要执行某个任务时,不管哪个线程执行它。在这种情况下,我会设计 cleanup() 这样就可以在任何时候从任何线程安全地调用它。
p、 另请注意@hulk在评论中所说的:如果 cleanup() 比调用者愿意等待的时间要长,那么另一种选择是提交一个“一次性”任务,由同一个线程池尽快安排。

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

相关问题