Друг тип набор от задачи е наборът от планирани задачи. Съдейки по името, можем да предположим, че използваме този тип, за да планираме кога трябва да се стартира определена задача.

Този тип услуга е полезна, когато имаме задача да стартираме дейност след изтичане на известно време or искаме да планираме повтаряща се задача.

За да използваме такъв, извикваме Executors.newScheduledThreadPool(1) .

Ще говорим за параметрите малко по-късно. Но засега това, което трябва да знаем е, че когато се извика този метод, получаваме обект ScheduledExecutorService .

ScheduledExecutorService е интерфейс, който разширява ExecutorService .

В този интерфейс се появяват следните методи:

Метод Обяснение

ScheduledFuture<?>
schedule(Runnable command,
                                  long delay, TimeUnit unit);
Създава и изпълнява еднократно действие, което се изпълнява след определеното забавяне.

<V> ScheduledFuture<V>
schedule(Callable<V> callable,
                                      long delay, TimeUnit unit);
Създава и изпълнява aПланирано бъдещеобект, който се изпълнява след определено забавяне.

ScheduledFuture<?>
scheduleAtFixedRate(Runnable command,
                                             long initialDelay,
                                             long period,
                                             TimeUnit unit);
Създава и изпълнява повтарящо се действие, което се изпълнява първо след указаното първоначално забавяне и след това отново след посочения период. С други думи, изпълнението ще започне след initialDelay , след това initialDelay + period , след това initialDelay + 2 * period и т.н.

ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
                                                long initialDelay,
                                                long delay,
                                                TimeUnit unit);
Създава и изпълнява повтарящо се действие, което се изпълнява първо след указаното първоначално забавяне и след това отново с указаното забавяне между завършването на едно изпълнение и началото на следващото.

Така че интерфейсът ни позволява да изпълняваме задачи на редовни интервали or след известно забавяне.

Повече за метода newScheduledThreadPool.

Можем да го наречем по няколко начина:


newScheduledThreadPool(int corePoolSize)
corePoolSize е броят на нишките, които да се запазят в пула, дори ако са неактивни.

newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)

corePoolSize е броят на нишките, които да се запазят в пула, дори ако са неактивни.

threadFactory е фабриката, която да се използва при създаване на нови нишки.

И двата метода ще създадат пул от нишки, който може да планира действия за изпълнение след определено забавяне or периодично.

Нека да разгледаме пример, за да видим How работи ScheduledThreadPool .

Да предположим например, че имаме задача да проверяваме имейл на всеки 5 секунди, но тази проверка не трябва да засяга основната програма и води до потенциално потребление на допълнителни ресурси.

Имаме клас задачи, който симулира проверка на имейл.


public class Task implements Runnable {
   @Override
   public void run() {
       System.out.println("Checking email...");
   }
}

След това създаваме пул от нишки и планираме проверката.


ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);
executorService.scheduleAtFixedRate(new Task(), 0, 5, TimeUnit.SECONDS);

В изхода на всеки 5 секунди виждаме:

Проверка на имейла...

Като цяло можем да използваме такъв пул за извършване на периодични задачи за „домакинство“, Howто в примера. Задачите за поддръжка са задачи, които трябва да се изпълняват независимо от това Howво прави основната програма.