Java8 ScheduledExecutorService.scheduleAtFixedRate()

时间:2019-05-26 16:31:26

标签: java threadpool executorservice scheduledexecutorservice

我正在阅读一本Java8书籍,并发现scheduleAtFixedRatescheduleWithFixedDelayScheduledExecutorService方法之间的区别。

我了解这两种方法之间的区别,但是当我尝试编写简单的代码时。尚不清楚为什么scheduleAtFixedRate表现同步

如您所见,我正在池中分配100个线程。调度程序将每1ms提交一个新任务,每个任务的延迟为1s。

    ScheduledExecutorService s = Executors.newScheduledThreadPool(100);
    s.scheduleAtFixedRate(() -> {
        int num = new Random().nextInt(100);
        System.out.println("Hello World" + num);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Finished" + num);
    }, 0, 1, TimeUnit.MILLISECONDS);

但是为什么我得到这个输出?一个新任务将仅在另一个任务之后运行。

Hello World94
Finished94
Hello World14
Finished14
Hello World90
Finished90
Hello World26
Finished26

1 个答案:

答案 0 :(得分:3)

看看ScheduledThreadPoolExecutor#scheduleAtFixedRate的Javadoc

  

如果执行此任务所需的时间超过其期限,则     后续执行可能会延迟开始,但不会同时执行     执行。

所以不要等待它同时执行,它将始终按顺序执行。