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
   259   260   261   262   263   264   265   266