【问题标题】:How to stop Executors.newSingleThreadScheduledExecutor [duplicate]如何停止 Executors.newSingleThreadScheduledExecutor [重复]
【发布时间】:2017-01-11 10:09:28
【问题描述】:

我有:

private final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();

运行一个可运行的任务:

executorService.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS);

但似乎executorService 没有取消方法(wtf,为什么?),关闭它不是一个选项,我正在做一些相当简单的事情,所以使用Executors.newScheduledThreadPool(确实有@ 987654326@) 有点矫枉过正。

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

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

【问题讨论】:

  • 您正在寻找shutDown*() 方法之一。
  • 我只有来自executorServiceshutdownNowshutDown,两者都会阻止未来的任务,但我想要未来的任务。 @fge

标签: java multithreading java-8 scheduled-tasks


【解决方案1】:

executorService.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS); 返回一个ScheduledFuture<V>,它确实有一个cancel(boolean) 方法。 取消它的正确方法是通过未来取消它。

编辑:但是我相信这不能在任务执行时停止任务,只会阻止未来的执行。使用布尔标志要求任务知道Thread.isInterrupted() 系统。

【讨论】:

  • 所以我应该有一个ScheduledFuture<?> 的数据成员并在调用scheduleAtFixedRate 时填充它?因为我需要从可运行包装器中的任务本身停止任务。
  • 如果您唯一需要的是取消功能,只需从.run() 方法中抛出异常即可。合同明确表示这将停止任何未来的执行。
  • 但这不是例外吗?并且异常被认为是“运行时繁重”,所以这不是有点贵吗?
  • 如果您不想使用异常,那么您将需要某种包装器,使外部未来可用于任务,但这将是它自己的一种痛苦实现。
  • 这会将任务从调度程序中删除。或者这只会使isDone() 方法返回true。我问这个是因为我使用的是ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); ScheduledFuture<?> future = scheduler.scheduleAtFixedRate
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 2010-12-22
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多