Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.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_Concurrency_Java.util.concurrent - Fatal编程技术网

Java 如何使ScheduledExecutorService在其计划任务取消时自动终止

Java 如何使ScheduledExecutorService在其计划任务取消时自动终止,java,multithreading,concurrency,java.util.concurrent,Java,Multithreading,Concurrency,Java.util.concurrent,如果网络连接已打开超过几个小时,我将使用ScheduledExecutorService关闭它。但是,在大多数情况下,网络连接在到达超时之前就关闭了,因此我取消了ScheduledFuture。在本例中,我还希望executor服务终止并释放其线程池 令我惊讶的是,这并不是开箱即用的:虽然我在调度任务后对executor服务调用了shutdown(),但executor服务在其唯一调度的任务被取消时不会自动终止。从ExecutorService.shutdown()的JavaDoc中,此行为甚至

如果网络连接已打开超过几个小时,我将使用
ScheduledExecutorService
关闭它。但是,在大多数情况下,网络连接在到达超时之前就关闭了,因此我取消了
ScheduledFuture
。在本例中,我还希望executor服务终止并释放其线程池

令我惊讶的是,这并不是开箱即用的:虽然我在调度任务后对executor服务调用了
shutdown()
,但executor服务在其唯一调度的任务被取消时不会自动终止。从
ExecutorService.shutdown()
的JavaDoc中,此行为甚至可能是正确的,因为可以说已取消的任务尚未“执行”:

作废java.util.concurrent.ExecutorService.shutdown()

启动有序关机,执行以前提交的任务,但不接受新任务。如果调用已经关闭,则调用没有其他效果

我的问题是,这是否可以更改:是否可以将executor服务配置为在其唯一的计划任务被取消时自动终止


或者与JUnit测试相同的问题:

@Test
public void testExecutorServiceTerminatesWhenScheduledTaskIsCanceled() throws Exception {
    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    Runnable task = new Runnable() {
        @Override
        public void run() {
            // ...
        }
    };

    ScheduledFuture<?> scheduledTask = scheduler.schedule(task, 2000, TimeUnit.MILLISECONDS);
    scheduler.shutdown();
    // do more configuration here...

    Thread.sleep(1000);

    scheduledTask.cancel(false);

    Thread.sleep(100);
    assertThat(scheduler.isTerminated(), is(true)); // ... so that this passes!?
}
@测试
public void TestExecutorService Terminates WhenScheduledTaskisCancelled()引发异常{
ScheduledExecutorService scheduler=执行者。newScheduledThreadPool(1);
Runnable任务=新的Runnable(){
@凌驾
公开募捐{
// ...
}
};
ScheduledFuture scheduledTask=scheduler.schedule(任务,2000,时间单位.毫秒);
scheduler.shutdown();
//在这里进行更多配置。。。
睡眠(1000);
scheduledTask.cancel(假);
睡眠(100);
断言(scheduler.isTerminated(),为(true));/…这样就通过了!?
}

来自
ScheduledThreadPoolExecutor
(执行器返回的实际类型。NewsScheduledThreadPool)文档:

当提交的任务在运行前被取消时,执行将被抑制。默认情况下,此类已取消的任务不会自动从工作队列中删除,直到其延迟消失。虽然这样可以进行进一步的检查和监视,但也可能会导致取消任务的无限保留。要避免这种情况,请将setRemoveOnCancelPolicy(布尔值)设置为true,这将导致在取消任务时立即从工作队列中删除任务


这是一个
ScheduledThreadPoolExecutor
方法。我不相信纯粹使用
ScheduledExecutorService
接口就可以解决这个问题。

试试
scheduler.awaitTermination(1000,TimeUnit.ms)尝试
调度程序.shutdownNow()甜蜜!这就是我要找的。我将检查
ScheduledThreadPoolExecutor
是否也适用于我。这将是因为它实现了
ScheduledExecutorService
,实例化会更加繁琐。查看静态方法的实现
Executors.newScheduledThreadPool()