我正在使用scheduledexecutorservice生成一个线程,如下所示:
private ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
private ScheduledFuture<?> scheduledFuture = ses.scheduleWithFixedDelay(() -> { cleanup(); }, 0L, 5L, TimeUnit.SECONDS);
在执行cleanup函数之间有5秒钟的睡眠时间。
在某些情况下,是否有唤醒此线程以开始运行清理而不是等待5秒来触发它的规定?
示例:在调用t1->cleanup时,在t1+2s->我想唤醒线程来显式地进行清理
1条答案
按热度按时间vbopmzt11#
我想唤醒线程来进行清理。
为什么不直接打电话
cleanup()
从任何其他线程看到的需要?我可以这样做,但我希望线程总是运行清理。
首先,当线程池执行清理任务时,不能依赖它总是使用同一个线程。您通过调用
Executors.newScheduledThreadPool(1)
,但是1
参数仅指定池中的最小线程数。在将同一线程池用于多个任务的程序中,只要池始终保持一个线程就绪,就可以根据需要自由创建和销毁工作线程。其次,这只是我个人的观点,以这样的方式设计多线程程序是一种很好的做法:每当需要执行某个任务时,不管哪个线程执行它。在这种情况下,我会设计
cleanup()
这样就可以在任何时候从任何线程安全地调用它。p、 另请注意@hulk在评论中所说的:如果
cleanup()
比调用者愿意等待的时间要长,那么另一种选择是提交一个“一次性”任务,由同一个线程池尽快安排。