Интерфейс Executor
- Все известные подинтерфейсы:
-
ExecutorService,ScheduledExecutorService
- Все известные реализующие классы:
-
AbstractExecutorService,ForkJoinPool,ScheduledThreadPoolExecutor,ThreadPoolExecutor
public interface Executor
Объект, который выполняет переданные Runnable задачи. Этот интерфейс предоставляет способ отделить отправку задач от механизмов их выполнения, включая детали использования потоков, планирования и т. д. Обычно используется Executor, а не явное создание потоков. Например, вместо вызова new Thread(new RunnableTask()).start() для каждой из задач, можно использовать:
Executor executor = anExecutor(); executor.execute(new RunnableTask1()); executor.execute(new RunnableTask2()); ...Однако интерфейс
Executor не строго требует асинхронного выполнения. В простейшем случае исполнитель может выполнить переданную задачу немедленно в потоке вызывающего метода: class DirectExecutor implements Executor {
public void execute(Runnable r) {
r.run();
}
} Чаще всего задачи выполняются в другом потоке, отличном от потока вызывающего метода. Приведенный ниже исполнитель порождает новый поток для каждой задачи. class ThreadPerTaskExecutor implements Executor {
public void execute(Runnable r) {
new Thread(r).start();
}
} Многие реализации Executor налагают определённые ограничения на способ и время планирования задач. Приведенный ниже исполнитель сериализует отправку задач другому исполнителю, иллюстрируя составной исполнитель. class SerialExecutor implements Executor {
final Queue<Runnable> tasks = new ArrayDeque<>();
final Executor executor;
Runnable active;
SerialExecutor(Executor executor) {
this.executor = executor;
}
public synchronized void execute(Runnable r) {
tasks.add(() -> {
try {
r.run();
} finally {
scheduleNext();
}
});
if (active == null) {
scheduleNext();
}
}
protected synchronized void scheduleNext() {
if ((active = tasks.poll()) != null) {
executor.execute(active);
}
}
} Реализации Executor в этом пакете реализуют ExecutorService, что является более расширенным интерфейсом. Класс ThreadPoolExecutor предоставляет расширяемую реализацию пула потоков. Класс Executors предоставляет удобные фабричные методы для этих исполнителей.
Влияние на согласованность памяти: Действия в потоке перед отправкой объекта Runnable в Executor предшествуют его началу выполнения, возможно, в другом потоке.
- С тех пор:
- 1.5
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
execute(Runnable command) |
Выполняет заданный командный элемент в какой-то момент в будущем. |
Методы
execute
void execute(Runnable command)
Выполняет заданный командный элемент в какой-то момент в будущем. Командный элемент может быть выполнен в новом потоке, в пуле потоков или в потоке вызова, по усмотрению реализации Executor.
- Параметры:
-
command- выполнимое задание - Исключения:
-
RejectedExecutionException- если эта задача не может быть принята для выполнения -
NullPointerException- если командный элемент равен null
© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/Executor.html