Java 仅关闭ScheduledExecutorService中的一个任务

Java 仅关闭ScheduledExecutorService中的一个任务,java,Java,我有几个任务是由注册的 final ScheduledExecutorService ses = Executors.newScheduledThreadPool(10); List<ScheduledFuture<?>> futures = new ArrayList<>(); tasks.forEach(task->{ var future = ses.scheduleWithFixedDelay(() -&g

我有几个任务是由注册的

final ScheduledExecutorService ses = Executors.newScheduledThreadPool(10);
List<ScheduledFuture<?>> futures = new ArrayList<>();
        tasks.forEach(task->{
            var future = ses.scheduleWithFixedDelay(() -> run(task), 0, 3, TimeUnit.SECONDS);
            futures.add(future);
});

// and now cancel all tasks one for one after 10 seconds..
ses.scheduleWithFixedDelay(() ->
        {
            log.info("cancel task----");
            futures.get(0).cancel(false);
        }, 0, 10, TimeUnit.SECONDS);
如您所见,对于每个任务,futures都会保存一个task.getId,这样我就可以在以后获得任务的ScheduledFuture。我不想关闭ses.shutdown,因为这将关闭其他任务的整个计划,我希望避免这样做

我实际看到的唯一解决方案是为每个任务创建一个ScheduledExecutorService,以便能够在以后为指定的任务关闭它,但这样我就无法使用池

如何仅关闭池中的指定任务?

使用

Future<?> future;
future.cancel(false);

²,

使用

Future<?> future;
future.cancel(false);


²,

scheduleWithFixedDelay有一个返回值,它为您提供了一个可以满足您需要的API。我只看到getScheduledFuture.cancelfalse,但这只会取消实际计划的任务,而不会取消下一个。因此,下一个计划将再次执行该任务,我不想一次又一次地取消它..我想从队列中完全删除此任务。我看不到适用于此的API。cancel将取消该任务及其任何进一步的调度,如果任务已经在运行并阻塞资源,则boolean参数决定是否要对该任务抛出中断异常。@nimo23,虽然默认情况下取消的任务不会立即从执行者队列中删除,但执行者不会再运行取消的任务,因为FutureTask是一个有状态对象,并且不会在取消状态下运行实际的任务代码。@prokhorov这是错误的。只要任务在计划执行者队列中,下一个任务就会运行..如果在实际运行中取消它并不重要..对于实际运行,它会被取消,但对于下一次运行则不会。scheduleWithFixedDelay有一个返回值,它为您提供了一个满足您需要的API。我只看到getScheduledFuture.cancelfalse,但这是将只取消实际计划的任务,而不取消下一个。因此,下一个计划将再次执行该任务,我不想一次又一次地取消它..我想从队列中完全删除此任务。我看不到适用于此的API。cancel将取消该任务及其任何进一步的调度,如果任务已经在运行并阻塞资源,则boolean参数决定是否要对该任务抛出中断异常。@nimo23,虽然默认情况下取消的任务不会立即从执行者队列中删除,但执行者不会再运行取消的任务,因为FutureTask是一个有状态对象,并且不会在取消状态下运行实际的任务代码。@prokhorov这是错误的。只要任务在计划执行器队列中,下一个任务将运行..无论您是否在实际运行中取消它..对于实际运行,它将被取消,但对于下一次运行则不会。我看到ScheduledThreadPoolExecutor的removeOnCancel布尔字段,我正在尝试确定如何配置它。也许在你的情况下,它被设置为false?我更新了我的代码..根据我的示例,取消实际计划中的一个任务不会取消下一个计划中的同一个任务。因此,进一步的日程安排并没有取消。我需要继续我的研究,直到我弄清楚如何设置有趣的SetRemoveOnCancelPolicy。无法查看如何将removeOnCancel设置为true。很可能是新的Executors.newScheduledThreadPool10;将此属性设置为false。但我看不到如何将其设置为true。编辑了回答我看到ScheduledThreadPoolExecutor的removeOnCancel布尔字段,我正在尝试确定如何配置它。也许在你的情况下,它被设置为false?我更新了我的代码..根据我的示例,取消实际计划中的一个任务不会取消下一个计划中的同一个任务。因此,进一步的日程安排并没有取消。我需要继续我的研究,直到我弄清楚如何设置有趣的SetRemoveOnCancelPolicy。无法查看如何将removeOnCancel设置为true。很可能是新的Executors.newScheduledThreadPool10;将此属性设置为false。但我看不出如何设置为真。编辑了答案