Запуск потоков с интервалом (scheduleAtFixedRate(task, 1, 2, TimeUnit.SECONDS)) - SheduledExecutorService

Существует вот такой пример кода

public class ExecutorsRunnableRun {

    public static void main(String[] args) {

        ScheduledExecutorService scheduledExecutorService =
                Executors.newScheduledThreadPool(4);


        IntStream.range(0, 7).forEach(

                i ->  {

                    Task task = new Task(i);
                    scheduledExecutorService.scheduleAtFixedRate(task, 1, 2, TimeUnit.SECONDS);
                }
        );

        scheduledExecutorService.shutdown();
        try {
            scheduledExecutorService.awaitTermination(1000, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }


    private static class Task implements Runnable {

        private final int idThread;

        private Task(int idThread) {
            this.idThread = idThread;
        }

        @Override
        public void run() {

            System.out.println(Thread.currentThread().getName() +
                    ": Запущен в итерациии № " + this.idThread);
        }
    }

я хотел бы увидеть, что поток запуститься с задеркжой в 1 секунду (относительно момента, когда мы укзалали задачу потоку, но не запускаем ее сразу, а через некоторое время)

затем поток должен выполнить еще одну задачу, но через 2 секунды.

Итераций 7, и потоки должны выполнить задачу 14 раз, и при этом будут переиспользоваться те потоки, которые созданы в фиксированном пуле.

Так ?

scheduleAtFixedRate(task, 1, 2, TimeUnit.SECONDS)

Как я понимаю, как только приложение запуститься, 1-й поток запуститься не сразу, а через 1 секунду, и затем выполнит задачу.

И эта же задача будет выполнена через 2 секунды снова.

Затем на следующей итерации алгоритм повториться.

Таким образом, за каждую итерацию, каждый поток выполнит задачу - 2 раза.

Так ?

Но потоки не успевают выполниться и приложение останавливается.

Почему ?

Для того, чтобы увидеть работу такого механизма, мне пришлось формировать задачи с задержкой.


        IntStream.range(0, 7).forEach(

                i ->  {

                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    Task task = new Task(i);
                    scheduledExecutorService.scheduleAtFixedRate(task, 1, 2, TimeUnit.SECONDS);
                }
        );

Тогда не вижу смысла в таком планировщике.

Кто знает, разъясните данный механизм.


Ответы (0 шт):