Java8 ScheduledExecutorService.scheduleAtFixedRate () - PullRequest
2 голосов
/ 26 мая 2019

Я читаю книгу java8 и сталкиваюсь с разницей между scheduleAtFixedRate и scheduleWithFixedDelay методами от ScheduledExecutorService.

Я понимаю разницу между этими двумя методами в книге, однако, когда я пытался написать простой код. Не очень понятно, почему scheduleAtFixedRate ведет себя синхронно .

Как видите, я выделяю 100 потоков в пуле. Планировщик будет отправлять новое задание каждые 1 мс, а для каждого задания задержка составляет 1 с.

    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 Ответ

3 голосов
/ 26 мая 2019

Взгляните на Javadoc для ScheduledThreadPoolExecutor#scheduleAtFixedRate

Если любое выполнение этой задачи занимает больше времени, чем ее, то последующие казни могут начаться поздно, но не будут одновременно выполнять.

Так что не ждите, чтобы он выполнялся одновременно, он всегда будет выполняться последовательно ..

...