Page 264 - 6571
P. 264
Іноді необхідно встановити час затримки для виконання де-
якого коду, тоді на допомогу приходить клас ScheduledExe
utorService. Він дозволяє запустити код на виконання в од-
ному або декількох потоках і налаштувати інтервал або час, на
який має бути відкладено виконання. Інтервалом може бути час
між двома послідовними запусками або час між закінченням
одного виконання і початком іншого. Методи класу Sched-
uledExecutorService повертають об’єкт класу Schedule-
dFuture, який надає метод getDelay() для отримання часу,
що залишився до запуску задачі.
ScheduledExecutorService executor =
Executors.newScheduledThreadPool(1);
Runnable task = () -> System.out.println("Task #1");
ScheduledFuture<?> future =
executor.schedule(task, 5, TimeUnit.SECONDS);
long remainingDelay =
future.getDelay(TimeUnit.MILLISECONDS);
System.out.println("Remaining Delay: " +
remainingDelay);
У виконавця з планувальником є два методи для установки
задач: scheduleAtFixedRate() та scheduleWithFixed
elay(). Перший встановлює задачу на виконання з певним ін-
тервалом (наприклад, в три секунди), та дозволяє задати почат-
кову затримку, яка визначає час до першого запуску:
Runnable task = () -> System.out.println("Task #1");
ScheduledFuture<?> future =
executor.scheduleAtFixedRate(task, 0, 3,
TimeUnit.SECONDS);
Прете, метод scheduleAtFixedRate() не бере до уваги
час виконання задачі. Наприклад, якщо встановити задачу, на ви-
конання якої потрібно сім секунд, з інтервалом в три, то пул по-
токів рано чи пізно переповниться.
Метод scheduleWithFixedDelay() працює приблизно
так само, як і scheduleAtFixedRate(), проте зазначений ін-
тервал буде відраховуватися від часу завершення попередньої за-
дачі.
263