Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.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 如何停止Executors.newSingleThreadScheduledExecutor_Java_Multithreading_Java 8_Scheduled Tasks - Fatal编程技术网

Java 如何停止Executors.newSingleThreadScheduledExecutor

Java 如何停止Executors.newSingleThreadScheduledExecutor,java,multithreading,java-8,scheduled-tasks,Java,Multithreading,Java 8,Scheduled Tasks,我有: 运行可运行任务的: private final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); 但是,executorService似乎没有取消方法(wtf,为什么?),关闭它不是一个选项,我正在使用executor做一些相当简单的事情。newScheduledThreadPool(它确实有cancel())有点过分了 有没有办法正确停止任务的执行 PS:我

我有:

运行可运行任务的:

private final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
但是,
executorService
似乎没有取消方法(wtf,为什么?),关闭它不是一个选项,我正在使用
executor做一些相当简单的事情。newScheduledThreadPool
(它确实有
cancel()
)有点过分了

有没有办法正确停止任务的执行


PS:我在询问之前搜索过,我真的认为这不是正确的方法。

executorService.scheduleAtFixedRate(任务,0,1,时间单位。秒)
返回一个
ScheduledFuture
,它确实有一个方法。 取消它的正确方法是在将来取消它


编辑:但是我认为这不能在任务执行时停止任务,只能防止将来执行。使用布尔标志要求任务意识到
Thread.isInterrupted()
系统。

您正在寻找
shutDown*()
方法之一。我只有
shutdownNow
shutDown
from
executorService
两种方法,这两种方法都会阻止将来的任务,但我想要将来的任务@fgeSo I应该为
ScheduledFuture
设置一个数据成员,并在调用
scheduleAtFixedRate
时填充它?因为我需要从runnable包装中的任务本身停止任务。如果您只需要取消功能,只需从
.run()
方法中抛出异常即可。合同明确规定这将停止今后的任何处决。但这不是例外情况吗?异常被认为是“运行时繁重的”,所以这不是有点贵吗?如果你不想使用异常,那么你需要某种包装器,使外部未来可用于任务,但这将是它自己的痛苦实现。这会从计划程序中删除任务吗。或者这只会使
isDone()
方法返回true。我这样问是因为我使用的是
ScheduledExecutorService scheduler=Executors.newSingleThreadScheduledExecutor();ScheduledFuture future=调度程序。scheduleAtFixedRate
executorService.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS);