首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >唤醒使用ScheduledExecutorService衍生的线程

唤醒使用ScheduledExecutorService衍生的线程
EN

Stack Overflow用户
提问于 2020-11-25 21:31:08
回答 1查看 48关注 0票数 0

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

代码语言:javascript
复制
    private ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
    private ScheduledFuture<?> scheduledFuture = ses.scheduleWithFixedDelay(() -> { cleanup(); }, 0L, 5L, TimeUnit.SECONDS);

在执行清理功能之间有5秒的休眠。

在某些情况下,是否提供了唤醒该线程以开始运行清理,而不是等待5秒触发它?

示例:在调用T1 -> cleanup时,在T1+2s ->中,我想唤醒线程以显式地进行清理

EN

回答 1

Stack Overflow用户

发布于 2020-11-25 21:52:51

,我想唤醒线程,显式地进行清理。

为什么不直接从其他认为需要的线程调用cleanup()呢?

代码语言:javascript
复制
void someTerriblyImportantFunction(...) {
    ...
    if (thisPlaceNeedsToBeCleanedUp_Like_NOW()) {
        cleanup();
    }
    ...
}

我可以这样做,但我希望线程总是运行清理。

首先,您不能依赖线程池在执行清理任务时始终使用相同的线程。您通过调用Executors.newScheduledThreadPool(1)创建了池,但参数1仅指定池中的最小线程数。在将同一线程池用于多个任务的程序中,只要始终保持一个线程处于就绪状态,线程池就可以根据需要自由地创建和销毁工作线程。

其次,这只是我个人的观点,这是一个很好的实践,设计你的多线程程序时,无论何时需要执行某个任务,哪个线程执行它都无关紧要。在这种情况下,我将设计cleanup(),以便可以在任何时间、从任何线程安全地调用它。

另外,还要注意@Hulk在评论中所说的话:如果cleanup()花费的时间超过了调用者愿意等待的时间,那么另一种选择是提交一个“一次性”任务,由同一个线程池尽快调度。

代码语言:javascript
复制
void someTerriblyImportantFunction(...) {
    ...
    if (thisPlaceNeedsToBeCleanedUp_RealSoon()) {
        ses.schedule(() -> { cleanup(); }, 1L, TimeUnit.MICROSECONDS);
    }
    ...
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65005691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档