Метод newScheduledThreadPool
Метод newScheduledThreadPool класса Executors создает
пул потоков, который умеет выполнять задачи по расписанию или
с задержкой. В первом параметре мы передаем количество потоков,
которые будут постоянно находиться в пуле. Второй параметр
необязательный и задает фабрику потоков. Метод возвращает объект
типа ScheduledExecutorService, который умеет запускать задачи
через заданный интервал времени.
В отличие от обычного пула потоков, задачи можно выполнять однократно с задержкой или периодически с фиксированным интервалом. Количество потоков в пуле остается постоянным, а лишние задачи ждут своей очереди в очереди задач.
Синтаксис
Executors.newScheduledThreadPool(corePoolSize, [threadFactory])
В первом параметре указываем количество потоков, которые будут постоянно поддерживаться в пуле. Второй параметр необязательный и задает фабрику для создания новых потоков.
Пример
Давайте создадим пул из 2 потоков и выполним задачу
с задержкой в 1 секунду:
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Main
{
public static void main(String[] args)
{
ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);
executor.schedule(() -> {
System.out.println("Task executed");
}, 1, TimeUnit.SECONDS);
executor.shutdown();
}
}
Результат выполнения кода:
"Task executed"
Пример
Давайте создадим пул из 1 потока и запустим задачу
периодически каждые 2 секунды:
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Main
{
public static void main(String[] args)
{
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(() -> {
System.out.println("Tick");
}, 0, 2, TimeUnit.SECONDS);
try
{
Thread.sleep(5000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
executor.shutdownNow();
}
}
Результат выполнения кода:
"Tick"
"Tick"
"Tick"
Пример
Давайте создадим пул из 3 потоков и выполним несколько
задач с разной задержкой:
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Main
{
public static void main(String[] args)
{
ScheduledExecutorService executor = Executors.newScheduledThreadPool(3);
executor.schedule(() -> {
System.out.println("First");
}, 1, TimeUnit.SECONDS);
executor.schedule(() -> {
System.out.println("Second");
}, 2, TimeUnit.SECONDS);
executor.schedule(() -> {
System.out.println("Third");
}, 3, TimeUnit.SECONDS);
try
{
Thread.sleep(4000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
executor.shutdown();
}
}
Результат выполнения кода:
"First"
"Second"
"Third"
Смотрите также
-
класс
ExecutorService,
который управляет выполнением задач -
метод
newFixedThreadPool,
который создает пул с фиксированным числом потоков -
метод
newCachedThreadPool,
который создает пул с кэшированными потоками -
метод
shutdown,
который завершает работу пула потоков