Java всегда сильно поддерживает параллельное и многопоточное программирование. Но в начале, до Java 5, поддержка была в форме вызова собственных конструкций на уровне приложений. Это было недостатком, потому что вы не могли обрабатывать примитивные вызовы более эффективно.
Что такое Executor Framework в Java?
Платформа Executor Framework в Java содержит множество компонентов, которые используются для эффективного управления несколькими потоками. Была выпущена с JDK 5, который используется для запуска объектов Runnable без создания новых потоков каждый раз, а также в основном с повторным использованием уже созданных потоков.
API-интерфейс Executor отделяет выполнение задачи от фактической задачи, выполняемой с помощью исполнителя. Это сосредоточено вокруг интерфейса Executor и его подчиненного интерфейса ExecutorService и класса ThreadPoolExecutor.
Используя этого исполнителя, только один должен реализовать работающие объекты и отправить их исполнителю для выполнения.
Пример
public class Test implements Runnable
{
private String message;
public Test(String message)
{
this.message = message;
}
@Override public String run() throws Exception
{
return "Hello " + message + "!";
}
}
В этом примере класс Test реализует Runnable и параметризируется для ввода строки. Также объявлено, чтобы бросить исключение. Кроме того, обратите внимание, что эта способность выдавать исключение исполнителю и исполнителю, возвращающему это исключение обратно, имеет большое значение, поскольку помогает ему узнать состояние выполнения задачи.
Типы
Есть в основном 4 типа Executor.
SingleThreadExecutor
Имеет только один поток и используется для последовательного выполнения задач. Если какой-либо поток умирает из-за исключения во время выполнения задачи, создается новый поток для замены старого потока, а последующие задачи выполняются в новом потоке.
FixedPoolExecutor
Пул с фиксированным количеством потоков. Задачи, переданные исполнителю, выполняются «n» -потоками и предполагают, что если есть еще задачи, которые нужно завершить, они хранятся в LinkedBlockingQueue.
CachedThreadExecutor
В основном используется, когда на линии много коротких параллельных задач, ожидающих выполнения. При сравнении с фиксированным пулом потоков количество потоков в этом пуле исполнителей здесь не ограничено. Если все потоки заняты выполнением назначенных задач и когда появляется новая задача, он создаст и добавит новый поток к исполнителю. Если поток остается бездействующим в течение почти шестидесяти секунд, он прекращается и удаляется из кэша.
ScheduledExecutor
Используется, когда у вас есть задача, которую нужно запускать через регулярные промежутки времени, или если вы хотите отложить определенную задачу. Задачи могут быть запланированы в ScheduledExecutor с использованием любого из двух методов scheduleAtFixedRate или scheduleWithFixedDelay.
Советы
- Всегда запускайте свой Java-код с инструментами статического анализа, такими как PMD и FindBugs.
- Не забудьте перепроверить и спланировать лучший код для просмотра верхних списков, чтобы обнаружить возможную взаимоблокировку или живую блокировку в коде во время выполнения.
- В многопоточных программах сделайте привычкой обнаруживать ошибки тут же, а не только исключения.
