我正在使用ScheduledExecutorService生成一个线程,如下所示:
private ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
private ScheduledFuture<?> scheduledFuture = ses.scheduleWithFixedDelay(() -> { cleanup(); }, 0L, 5L, TimeUnit.SECONDS);在执行清理功能之间有5秒的休眠。
在某些情况下,是否提供了唤醒该线程以开始运行清理,而不是等待5秒触发它?
示例:在调用T1 -> cleanup时,在T1+2s ->中,我想唤醒线程以显式地进行清理
发布于 2020-11-25 21:52:51
,我想唤醒线程,显式地进行清理。
为什么不直接从其他认为需要的线程调用cleanup()呢?
void someTerriblyImportantFunction(...) {
...
if (thisPlaceNeedsToBeCleanedUp_Like_NOW()) {
cleanup();
}
...
}我可以这样做,但我希望线程总是运行清理。
首先,您不能依赖线程池在执行清理任务时始终使用相同的线程。您通过调用Executors.newScheduledThreadPool(1)创建了池,但参数1仅指定池中的最小线程数。在将同一线程池用于多个任务的程序中,只要始终保持一个线程处于就绪状态,线程池就可以根据需要自由地创建和销毁工作线程。
其次,这只是我个人的观点,这是一个很好的实践,设计你的多线程程序时,无论何时需要执行某个任务,哪个线程执行它都无关紧要。在这种情况下,我将设计cleanup(),以便可以在任何时间、从任何线程安全地调用它。
另外,还要注意@Hulk在评论中所说的话:如果cleanup()花费的时间超过了调用者愿意等待的时间,那么另一种选择是提交一个“一次性”任务,由同一个线程池尽快调度。
void someTerriblyImportantFunction(...) {
...
if (thisPlaceNeedsToBeCleanedUp_RealSoon()) {
ses.schedule(() -> { cleanup(); }, 1L, TimeUnit.MICROSECONDS);
}
...
}https://stackoverflow.com/questions/65005691
复制相似问题