当前位置: 首页 > 面试题库 >

从ScheduledExecutorService中运行的任务本身中停止定期任务

狄卓君
2023-03-14
问题内容

在ScheduledExecutorService中运行时,是否有种不错的方法可以阻止任务内部重复任务?

可以说,我有以下任务:

Future<?> f = scheduledExecutor.scheduleAtFixedRate(new Runnable() {
    int count = 0;
    public void run() {
       System.out.println(count++);
       if (count == 10) {
           // ??? cancel self
       }
    }
}, 1, 1, TimeUnit.SECONDS);

从外部,很容易通过f.cancel()取消,但是如何在指定的位置停止重复?(通过AtomicReference传递Future是不安全的,因为当scheduleAtFixedRate返回f较晚并且变量也设置得较晚时,存在一个潜在的窗口,并且任务本身可能已经运行,在引用中看到空值。)


问题答案:

当重复任务抛出异常或错误时,它将被放置在Future中,并且该任务不会再次重复。您可以选择抛出RuntimeException或Error。



 类似资料:
  • 问题内容: 在ScheduledExecutorService中运行时,是否有种不错的方法可以阻止任务内部重复任务? 可以说,我有以下任务: 从外部,很容易通过f.cancel()取消,但是如何在指定的位置停止重复?(通过AtomicReference传递Future是不安全的,因为当scheduleAtFixedRate返回f late并且变量也被延迟设置时,存在一个潜在的窗口,并且任务本身可能

  • 问题内容: 我有一个时间周期性地与一些不同的任务; 我也有Runnable与此计划程序一起使用的不同之处。当我想从调度程序中删除任务之一时,问题就开始了。 有没有办法做到这一点? 我可以使用一个调度程序完成不同的任务吗?实现此目的的最佳方法是什么? 问题答案: 只需取消以下项返回的未来: 要注意的另一件事是,取消不会从计划程序中删除任务。它所确保的是isDone方法总是返回true。如果继续添加此

  • 问题内容: 因此,使用此链接作为参考,任何人都可以提出更优雅的解决方案来取消定期的ScheduledExecutorService任务吗? 这是我目前正在做的事的一个例子: 问题答案: 我建议您使用int并自己安排任务。

  • 问题内容: 有没有一种方法可以停止执行无限循环的线程? 问题答案: 是的,您可以将替换(或在逻辑上)。 这样,当任务取消时,循环将终止。 循环看起来像这样: 使用应该是这样的:

  • 问题内容: 我有一个ScheduledThreadPoolExecutor,可用来计划以固定速率运行的任务。我希望任务以指定的延迟最多运行10次,直到它“成功”为止。之后,我将不希望重试该任务。因此,基本上,当我希望停止计划任务时,需要停止运行它,但又不关闭ScheduledThreadPoolExecutor。知道我会怎么做吗? 这是一些伪代码- 问题答案: 运行此测试,它会打印并停止