Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 唤醒使用ScheduledExecutorService生成的线程_Java_Multithreading_Scheduledexecutorservice - Fatal编程技术网

Java 唤醒使用ScheduledExecutorService生成的线程

Java 唤醒使用ScheduledExecutorService生成的线程,java,multithreading,scheduledexecutorservice,Java,Multithreading,Scheduledexecutorservice,我正在使用ScheduledExecutorService生成一个线程,如下所示: private ScheduledExecutorService ses = Executors.newScheduledThreadPool(1); private ScheduledFuture<?> scheduledFuture = ses.scheduleWithFixedDelay(() -> { cleanup(); }, 0L, 5L, TimeUnit.SECO

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

    private ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
    private ScheduledFuture<?> scheduledFuture = ses.scheduleWithFixedDelay(() -> { cleanup(); }, 0L, 5L, TimeUnit.SECONDS);
private ScheduledExecutorService ses=Executors.newScheduledThreadPool(1);
private ScheduledFuture ScheduledFuture=ses.scheduleWithFixedDelay(()->{cleanup();},0L,5L,TimeUnit.SECONDS);
在执行cleanup函数之间有5秒钟的睡眠时间

在某些情况下,是否有唤醒此线程以开始运行清理而不是等待5秒来触发它的规定

示例:在调用T1->cleanup时,在T1+2s->我想唤醒线程以明确地执行清理

我想唤醒线程来进行清理

为什么不直接从任何其他线程调用
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);
    }
    ...
}

在这种情况下,您只需计划立即执行清理任务(使用,延迟为0)。不需要明确地唤醒任何东西。嗯,我需要每5秒做一次清理。但是在这段时间内,可能需要在第10秒和第15秒之间运行清理,明确唤醒线程的方法是什么?我可以这样做,但我希望线程总是运行清理。