当前位置: 首页 > 知识库问答 >
问题:

在下面的示例中,重复性任务如何完全“错过”四次调用?

马胜泫
2023-03-14

JCIP-的摘要

如果一个周期性计时器任务计划每10毫秒运行一次,而另一个计时器任务需要40毫秒才能运行,则周期性任务在长时间运行的任务完成后会被快速连续调用四次(取决于它是以固定速率还是固定延迟调度的),或者完全“错过”四次调用。

我知道,由于第一个任务计划每10毫秒运行一次,因此在40毫秒内,它将执行4次。

但作者所说的完全错过四次调用是什么意思呢?

共有2个答案

谢哲瀚
2023-03-14

因此,有两项任务。任务1计划每10毫秒运行一次,任务2计划每40毫秒运行一次。

假设在时间0时,任务2开始运行,紧接着,任务1被触发:

0.0:正在运行任务2

0.1:任务1已触发,任务2仍在运行。

10.1:任务1已触发,任务2仍在运行

20.1任务1已触发,任务2仍在运行

30.1任务1已触发,任务2仍在运行

40.0:任务2完成,任务1开始运行。

如您所见,从任务2开始到任务2结束,任务1被触发了4次,但没有运行的机会。此外,任务1将连续快速运行4次,因为它被触发了4次,但没有机会运行。

商经业
2023-03-14

下面是一个代码示例:

public static void main(String[] args) throws Exception {
    final long start = System.currentTimeMillis();
    Timer timer = new Timer();

    // Schedule a new task that runs at a 10ms interval and stars immediately
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            System.out.println("10ms delayed task ran at " + (System.currentTimeMillis() - start));
        }
    }, 0, 10);

    // Schedule a task to start in 50ms that takes 40ms to run.
    // It cancels itself so it's only run once.
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            System.out.println("slow task ran at " + (System.currentTimeMillis() - start));
            try {
                Thread.sleep(40);
            } catch (InterruptedException e) {

            }
            this.cancel();
        }
    }, 50, 10);

    // Wait 100 ms for the demo to end, then stop the timer.
    Thread.sleep(100);
    timer.cancel();
}

输出:

10ms delayed task ran at 1
10ms delayed task ran at 11
10ms delayed task ran at 22
10ms delayed task ran at 32
10ms delayed task ran at 42
slow task ran at 52
10ms delayed task ran at 92
 类似资料:
  • 我知道我的问题有答案,但我不理解代码中的问题。 为什么我得到: 我正试图使用controller类中的方法将任务中的文本添加到文本流中,由于某些原因,程序无法运行。getChildren()方法。 在控制器类中调用拆分器: 类拆分构造函数: 控制器类的一部分: 在拆分器类中调用updateHebFlow: 据我所知,除了控制器之外,我不能从其他类更改UI,所以我在控制器类中创建了一个方法,该方法将

  • 我的问题可能听起来很奇怪,但请耐心听我说。这就是我所拥有的: 表产品: 如何从中删除真正的重复项?如果您查看数据,您可以看到Pen C有三行数据完全相同。笔A有两行数据相同,一行成本不同。我不想取消“钢笔A”。 下面是一个简单的group by语句: 这不起作用,因为它也会拿起“钢笔A”。 感谢您的帮助。非常感谢。

  • 我有一个maven模块化项目,其构建顺序如下。 每个模块都有自己的pom。xml和构建顺序包含在父pom中。因此,当我对进行任何更改时,我应该只构建common模块还是再次构建所有模块,以从common模块获取最新的更改?

  • 我的应用程序包含一个ViewPager,其中包含5个片段。当片段1可见时,它还调用片段2的onCreate方法。我尝试使用、等。但我不喜欢这些在我的应用程序中的表现。 当相邻片段可见时,是否有一种方法可以禁止调用片段的onCreate?

  • 我有一个任务执行10秒,周期为1秒,没有延迟,另一个任务执行30秒,周期为5秒,当第一个任务完成时。 此外,我需要取消两个任务时,一个按钮被按下。 > 我尝试了基本线程,但将阻塞GUI,直到两个任务都执行 我尝试,但我这里是一个接一个地执行任务,但不是每个任务都定期执行 我尝试了预定的executor,但预定的executor是异步的,我知道如何使用 任何反馈都很感激。

  • 我有一个非常简单的Runnable,我想计划每30秒执行一次——请记住,为了这个问题,这只是一个简单的例子,而不是在现实中使用它的实际意义。 我正在使用Timer和TimerTask,但遇到了一个问题:每当TimerTask引发未经检查的异常时,该任务的任何后续执行都将被取消;因此,上面的任务实际上只运行一次,因为它会抛出一个未经检查的除法为0的异常。 据我所知,ScheduledThreadPo