Класс ForkJoinPool
- Все реализуемые интерфейсы:
AutoCloseable, Executor, ExecutorService, ScheduledExecutorService
public class ForkJoinPool extends AbstractExecutorService implements ScheduledExecutorService
ExecutorService для выполнения задач ForkJoinTask. ForkJoinPool предоставляет точку входа для отправки задач клиентами, не являющимися ForkJoinTask, а также операции управления и мониторинга. ForkJoinPool отличается от других видов ExecutorService главным образом использованием work-stealing (похищения работ): все потоки в пуле пытаются найти и выполнить задачи, отправленные в пул и/или созданные другими активными задачами (в конечном счёте блокируясь в ожидании работы, если её нет). Это обеспечивает эффективную обработку, когда большинство задач порождают другие подзадачи (как это делают большинство задач ForkJoinTask), а также когда множество небольших задач отправляется в пул внешними клиентами. В частности, если в конструкторах установить asyncMode в значение true,
ForkJoinPool также могут быть подходящими для использования с задачами событийного типа, которые никогда не объединяются. Все рабочие потоки инициализируются с параметром Thread.isDaemon(), установленным в значение true.
Доступен статический commonPool(), подходящий для большинства приложений. Общий пул используется любой задачей ForkJoinTask, которая явно не отправлена в указанный пул. Использование общего пула обычно сокращает потребление ресурсов (его потоки медленно освобождаются в периоды неиспользования и восстанавливаются при последующем использовании).
Для приложений, которым требуются отдельные или настраиваемые пулы, можно создать
ForkJoinPool с заданным целевым уровнем параллелизма; по умолчанию он равен числу доступных процессоров. Пул пытается поддерживать достаточное количество активных (или доступных) потоков, динамически добавляя, приостанавливая или возобновляя внутренние рабочие потоки, даже если некоторые задачи заблокированы в ожидании объединения с другими. Однако такие корректировки не гарантируются при блокировке ввода-вывода или другой неуправляемой синхронизации. Вложенный интерфейс ForkJoinPool.ManagedBlocker позволяет расширить набор поддерживаемых видов синхронизации. Политики по умолчанию можно переопределить с помощью конструктора с параметрами, соответствующими описанным в классе ThreadPoolExecutor.
Помимо методов выполнения задач и управления жизненным циклом, этот класс предоставляет методы проверки состояния (например, getStealCount()), предназначенные для помощи в разработке, настройке и мониторинге приложений fork/join. Кроме того, метод toString() возвращает удобное для неформального мониторинга представление состояния пула.
Как и в случае с другими ExecutorServices, существуют три основных метода выполнения задач, приведённые в следующей таблице. Они предназначены прежде всего для клиентов, ещё не участвующих в вычислениях fork/join в текущем пуле. Основные формы этих методов принимают экземпляры ForkJoinTask, но перегруженные формы также допускают смешанное выполнение действий на основе обычных
Runnable или Callable. Однако задачи, уже выполняющиеся в пуле, обычно должны использовать формы для выполнения внутри вычислений, перечисленные в таблице, за исключением задач асинхронного событийного типа, которые обычно не объединяются; в этом случае различия между методами невелики.
| Вызов из клиента, не участвующего в fork/join | Вызов из вычислений fork/join | |
|---|---|---|
| Организовать асинхронное выполнение | execute(ForkJoinTask)
| ForkJoinTask.fork()
|
| Дождаться результата и получить его | invoke(ForkJoinTask)
| ForkJoinTask.invoke()
|
| Организовать выполнение и получить Future | submit(ForkJoinTask)
| ForkJoinTask.fork() (ForkJoinTasks являются Future) |
Кроме того, этот класс поддерживает методы ScheduledExecutorService для отложенного или периодического выполнения задач, а также метод submitWithTimeout(Callable, long, TimeUnit, Consumer) для отмены задач, выполнение которых занимает слишком много времени. Запланированные функции или действия могут создавать и вызывать другие ForkJoinTasks. Отложенные действия становятся доступными и ведут себя как обычные отправленные задачи по истечении задержки. Методы планирования возвращают ForkJoinTasks, реализующие интерфейс ScheduledFuture. Исчерпание ресурсов, возникшее после первоначальной отправки, приводит к отмене задачи. При использовании методов, зависящих от времени, политики завершения работы соответствуют политикам по умолчанию класса ScheduledThreadPoolExecutor: при вызове shutdown() существующие периодические задачи больше не выполняются, а пул завершает работу, когда в нём не остаётся активных задач и завершаются существующие отложенные задачи. Метод cancelDelayedTasksOnShutdown() можно использовать для отключения всех отложенных задач при завершении работы, а метод shutdownNow() — для безусловного инициирования завершения работы пула. Методы мониторинга, такие как getQueuedTaskCount(), не учитывают запланированные задачи, выполнение которых ещё не разрешено; их количество отдельно возвращает метод getDelayedTaskCount().
Параметры, используемые для создания общего пула, можно задавать с помощью следующих системных свойств:
-
java.util.concurrent.ForkJoinPool.common.parallelism— уровень параллелизма, неотрицательное целое число. Использовать не рекомендуется. Вместо этого используйтеsetParallelism(int). -
java.util.concurrent.ForkJoinPool.common.threadFactory— имя классаForkJoinPool.ForkJoinWorkerThreadFactory. Для загрузки этого класса используется системный загрузчик классов. -
java.util.concurrent.ForkJoinPool.common.exceptionHandler— имя классаThread.UncaughtExceptionHandler. Для загрузки этого класса используется системный загрузчик классов. -
java.util.concurrent.ForkJoinPool.common.maximumSpares— максимальное количество дополнительных потоков, которые разрешено поддерживать для достижения целевого уровня параллелизма (по умолчанию 256).
null; в этом случае некоторые задачи могут никогда не выполниться. Хотя установить для свойства параллелизма значение ноль возможно, настоятельно не рекомендуется этого делать: при наличии задач, по своей природе выполняющихся асинхронно, это значение может быть переопределено внутренними механизмами.- Примечание по реализации:
- Эта реализация ограничивает максимальное количество работающих потоков значением 32767. Попытки создать пулы, размер которых превышает этот максимум, приводят к
IllegalArgumentException. Кроме того, эта реализация отклоняет отправленные задачи (то есть выбрасываетRejectedExecutionException) только в том случае, если пул завершает работу или исчерпаны внутренние ресурсы. - С версии:
- 1.7
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
static interface |
ForkJoinPool.ForkJoinWorkerThreadFactory |
Фабрика для создания новых ForkJoinWorkerThread. |
static interface |
ForkJoinPool.ManagedBlocker |
Интерфейс для расширения управляемого параллелизма задач, выполняющихся в ForkJoinPool. |
Краткое описание полей
| Модификатор и тип | Поле | Описание |
|---|---|---|
static final ForkJoinPool.ForkJoinWorkerThreadFactory |
defaultForkJoinWorkerThreadFactory |
Создаёт новый ForkJoinWorkerThread. |
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
ForkJoinPool() |
Создаёт ForkJoinPool с уровнем параллелизма, равным Runtime.availableProcessors(), используя значения по умолчанию для всех остальных параметров (см. ForkJoinPool(int, ForkJoinWorkerThreadFactory, UncaughtExceptionHandler, boolean, int, int, int, Predicate, long, TimeUnit)). |
ForkJoinPool |
Создаёт ForkJoinPool с указанным уровнем параллелизма, используя значения по умолчанию для всех остальных параметров (см. ForkJoinPool(int, ForkJoinWorkerThreadFactory, UncaughtExceptionHandler, boolean, int, int, int, Predicate, long, TimeUnit)). |
ForkJoinPool |
Создаёт ForkJoinPool с заданными параметрами (для остальных используются значения по умолчанию — см. ForkJoinPool(int, ForkJoinWorkerThreadFactory, UncaughtExceptionHandler, boolean, int, int, int, Predicate, long, TimeUnit)). |
ForkJoinPool |
Создаёт ForkJoinPool с заданными параметрами. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
boolean |
awaitQuiescence |
Если вызван задачей ForkJoinTask, выполняющейся в этом пуле, по эффекту эквивалентен ForkJoinTask.helpQuiesce(). |
boolean |
awaitTermination |
Блокирует выполнение до тех пор, пока все задачи не завершат выполнение после запроса на завершение работы, не истечёт время ожидания или не будет прерван текущий поток — в зависимости от того, что произойдёт первым. |
void |
cancelDelayedTasksOnShutdown() |
Указывает, что запланированные задачи, которые не выполняются и для которых ещё не разрешено выполнение, не будут выполняться и будут отменены при вызове shutdown() (если только этот пул не является commonPool(), который никогда не завершает работу). |
void |
close() |
Если это не commonPool(), инициирует штатное завершение работы, при котором ранее отправленные задачи выполняются, новые задачи не принимаются, а метод ожидает завершения всех задач и завершения работы исполнителя. |
static ForkJoinPool |
commonPool() |
Возвращает экземпляр общего пула. |
protected int |
drainTasksTo |
Удаляет все доступные невыполненные отправленные и forked-задачи из очередей планирования и добавляет их в указанную коллекцию, не изменяя их состояние выполнения. |
void |
execute |
Выполняет указанную команду в некоторый момент в будущем. |
void |
execute |
Организует (асинхронное) выполнение указанной задачи. |
<T> ForkJoinTask |
externalSubmit |
Отправляет указанную задачу так, как если бы она была отправлена клиентом, не являющимся ForkJoinTask. |
int |
getActiveThreadCount() |
Возвращает оценочное количество потоков, которые в данный момент похищают или выполняют задачи. |
boolean |
getAsyncMode() |
Возвращает true, если этот пул использует локальный режим планирования «первым пришёл — первым обслужен» для forked-задач, которые никогда не объединяются. |
static int |
getCommonPoolParallelism() |
Возвращает целевой уровень параллелизма общего пула. |
long |
getDelayedTaskCount() |
Возвращает оценочное количество отложенных (включая периодические) задач, запланированных в этом пуле, выполнение которых ещё не готово начаться. |
ForkJoinPool.ForkJoinWorkerThreadFactory |
getFactory() |
Возвращает фабрику, используемую для создания новых рабочих потоков. |
int |
getParallelism() |
Возвращает целевой уровень параллелизма этого пула. |
int |
getPoolSize() |
Возвращает количество рабочих потоков, которые были запущены, но ещё не завершились. |
int |
getQueuedSubmissionCount() |
Возвращает оценочное количество задач, отправленных в этот пул, выполнение которых ещё не началось. |
long |
getQueuedTaskCount() |
Возвращает оценочное общее количество задач, находящихся в очередях рабочих потоков (не включая задачи, отправленные в пул, выполнение которых ещё не началось). |
int |
getRunningThreadCount() |
Возвращает оценочное количество рабочих потоков, которые не заблокированы в ожидании объединения задач или другой управляемой синхронизации. |
long |
getStealCount() |
Возвращает оценочное общее количество завершённых задач, выполненных потоком, отличным от потока, отправившего их. |
Thread.UncaughtExceptionHandler |
getUncaughtExceptionHandler() |
Возвращает обработчик внутренних рабочих потоков, завершающихся из-за невосстановимых ошибок, возникших во время выполнения задач. |
boolean |
hasQueuedSubmissions() |
Возвращает true, если в этом пуле есть задачи, выполнение которых ещё не началось. |
<T> T |
invoke |
Выполняет указанную задачу и возвращает её результат после завершения. |
<T> List |
invokeAll |
Выполняет указанные задачи и возвращает список объектов Future с их состояниями и результатами после завершения всех задач. |
<T> List |
invokeAll |
Выполняет указанные задачи и возвращает список объектов Future с их состояниями и результатами после завершения всех задач или истечения времени ожидания — в зависимости от того, что произойдёт первым. |
<T> List |
invokeAllUninterruptibly |
Версия invokeAll, не подверженная прерыванию. |
<T> T |
invokeAny |
Выполняет указанные задачи и возвращает результат одной из них, успешно завершившейся (то есть не выбросившей исключение), если такая есть. |
<T> T |
invokeAny |
Выполняет указанные задачи и возвращает результат одной из них, успешно завершившейся (то есть не выбросившей исключение), если такая задача завершится до истечения указанного времени ожидания. |
boolean |
isQuiescent() |
Возвращает true, если в данный момент все рабочие потоки простаивают. |
boolean |
isShutdown() |
Возвращает true, если работа этого пула завершена. |
boolean |
isTerminated() |
Возвращает true, если после завершения работы все задачи выполнены. |
boolean |
isTerminating() |
Возвращает true, если процесс завершения работы начался, но ещё не завершён. |
<T> ForkJoinTask |
lazySubmit |
Отправляет указанную задачу, не гарантируя, что она в конечном итоге будет выполнена при отсутствии доступных активных потоков. |
static void |
managedBlock |
Выполняет указанную задачу, которая может блокироваться. |
protected ForkJoinTask |
pollSubmission() |
Удаляет и возвращает следующую невыполненную отправленную задачу, если она доступна. |
ScheduledFuture |
schedule |
Отправляет одноразовую задачу, выполнение которой становится доступным после указанной задержки. |
<V> ScheduledFuture |
schedule |
Отправляет одноразовую задачу, возвращающую значение, выполнение которой становится доступным после указанной задержки. |
ScheduledFuture |
scheduleAtFixedRate |
Отправляет периодическое действие, первое выполнение которого становится доступным после указанной начальной задержки, а последующие выполняются с указанным периодом; то есть выполнение начнётся после initialDelay, затем после initialDelay + period, затем после initialDelay + 2 * period и так далее. |
ScheduledFuture |
scheduleWithFixedDelay |
Отправляет периодическое действие, первое выполнение которого становится доступным после указанной начальной задержки, а последующие — с указанной задержкой между завершением одного выполнения и началом следующего. |
int |
setParallelism |
Изменяет целевой уровень параллелизма этого пула, управляя последующим созданием, использованием и завершением рабочих потоков. |
void |
shutdown() |
При необходимости инициирует штатное завершение работы, при котором ранее отправленные задачи выполняются, а новые задачи не принимаются. |
List |
shutdownNow() |
При необходимости пытается отменить и/или остановить все задачи и отклоняет все последующие отправленные задачи. |
ForkJoinTask |
submit |
Отправляет задачу Runnable на выполнение и возвращает Future, представляющий эту задачу. |
<T> ForkJoinTask |
submit |
Отправляет задачу Runnable на выполнение и возвращает Future, представляющий эту задачу. |
<T> ForkJoinTask |
submit |
Отправляет на выполнение задачу, возвращающую значение, и возвращает Future, представляющий ожидаемые результаты задачи. |
<T> ForkJoinTask |
submit |
Отправляет ForkJoinTask на выполнение. |
<V> ForkJoinTask |
submitWithTimeout |
Отправляет задачу, выполняющую указанную функцию, и отменяет её или выполняет указанное действие timeoutAction, если задача не завершится в течение заданного времени ожидания. |
String |
toString() |
Возвращает строку, идентифицирующую этот пул и описывающую его состояние, включая сведения о состоянии выполнения, уровне параллелизма, а также количестве рабочих потоков и задач. |
Методы, объявленные в классе AbstractExecutorService
invokeAll, invokeAll, invokeAny, invokeAny, newTaskFor, newTaskFor
Подробное описание полей
defaultForkJoinWorkerThreadFactory
public static final ForkJoinPool.ForkJoinWorkerThreadFactory defaultForkJoinWorkerThreadFactory
Подробное описание конструкторов
ForkJoinPool
public ForkJoinPool()
ForkJoinPool с параллелизмом, равным Runtime.availableProcessors(), и значениями по умолчанию для всех остальных параметров (см. ForkJoinPool(int, ForkJoinWorkerThreadFactory, UncaughtExceptionHandler, boolean, int, int, int, Predicate, long, TimeUnit)).ForkJoinPool
public ForkJoinPool(int parallelism)
ForkJoinPool с указанным уровнем параллелизма и значениями по умолчанию для всех остальных параметров (см. ForkJoinPool(int, ForkJoinWorkerThreadFactory, UncaughtExceptionHandler, boolean, int, int, int, Predicate, long, TimeUnit)).- Параметры:
-
parallelism— уровень параллелизма - Исключения:
-
IllegalArgumentException— если параллелизм меньше или равен нулю либо превышает ограничение реализации
ForkJoinPool
public ForkJoinPool(int parallelism, ForkJoinPool.ForkJoinWorkerThreadFactory factory, Thread.UncaughtExceptionHandler handler, boolean asyncMode)
ForkJoinPool с указанными параметрами (для остальных используются значения по умолчанию — см. ForkJoinPool(int, ForkJoinWorkerThreadFactory, UncaughtExceptionHandler, boolean, int, int, int, Predicate, long, TimeUnit)).- Параметры:
-
parallelism— уровень параллелизма. Чтобы использовать значение по умолчанию, укажитеRuntime.availableProcessors(). -
factory— фабрика для создания новых потоков. Чтобы использовать значение по умолчанию, укажитеdefaultForkJoinWorkerThreadFactory. -
handler— обработчик внутренних рабочих потоков, которые завершаются из-за неисправимых ошибок, возникших при выполнении задач. Чтобы использовать значение по умолчанию, укажитеnull. -
asyncMode— если значение равно true, для разделённых задач, к которым никогда не присоединяются, устанавливается локальный режим планирования FIFO. Этот режим может быть предпочтительнее режима по умолчанию на основе локального стека в приложениях, где рабочие потоки обрабатывают только асинхронные задачи, связанные с событиями. Чтобы использовать значение по умолчанию, укажитеfalse. - Исключения:
-
IllegalArgumentException— если параллелизм меньше или равен нулю либо превышает ограничение реализации -
NullPointerException— если фабрика равна null
ForkJoinPool
public ForkJoinPool(int parallelism, ForkJoinPool.ForkJoinWorkerThreadFactory factory, Thread.UncaughtExceptionHandler handler, boolean asyncMode, int corePoolSize, int maximumPoolSize, int minimumRunnable, Predicate<? super ForkJoinPool> saturate, long keepAliveTime, TimeUnit unit)
ForkJoinPool с указанными параметрами.- Параметры:
-
parallelism— уровень параллелизма. Чтобы использовать значение по умолчанию, укажитеRuntime.availableProcessors(). -
factory— фабрика для создания новых потоков. Чтобы использовать значение по умолчанию, укажитеdefaultForkJoinWorkerThreadFactory. -
handler— обработчик внутренних рабочих потоков, которые завершаются из-за неисправимых ошибок, возникших при выполнении задач. Чтобы использовать значение по умолчанию, укажитеnull. -
asyncMode— если значение равно true, для разделённых задач, к которым никогда не присоединяются, устанавливается локальный режим планирования FIFO. Этот режим может быть предпочтительнее режима по умолчанию на основе локального стека в приложениях, где рабочие потоки обрабатывают только асинхронные задачи, связанные с событиями. Чтобы использовать значение по умолчанию, укажитеfalse. -
corePoolSize— игнорируется: использовался в предыдущих выпусках этого класса, но больше не применяется. Использование0обеспечивает совместимость между выпусками. -
maximumPoolSize— максимально допустимое количество потоков. При достижении максимума попытки заменить заблокированные потоки завершаются неудачей. (Однако из-за того, что создание и завершение разных потоков могут происходить одновременно и управляться указанной фабрикой потоков, это значение может временно превышаться.) Чтобы задать то же значение, которое используется по умолчанию для общего пула, укажите256плюс уровеньparallelism. (По умолчанию общий пул допускает не более 256 резервных потоков.) Значение (например,Integer.MAX_VALUE), превышающее общий лимит потоков реализации, действует так же, как этот лимит (используемый по умолчанию). -
minimumRunnable— минимально допустимое количество основных потоков, не заблокированных вызовом join илиForkJoinPool.ManagedBlocker. Для обеспечения прогресса, когда недостаточно незаблокированных потоков и могут существовать невыполненные задачи, создаются новые потоки — до указанного значения maximumPoolSize. Чтобы использовать значение по умолчанию, обеспечивающее живучесть, укажите1. Большее значение может повысить пропускную способность при наличии заблокированных операций, но может и не повысить её из-за увеличения накладных расходов. Значение 0 может быть приемлемым, если у отправленных задач нет зависимостей, требующих дополнительных потоков. -
saturate— если не равно null, предикат, вызываемый при попытках создать потоки сверх максимально допустимого общего количества. По умолчанию, если поток собирается заблокироваться при вызове join илиForkJoinPool.ManagedBlocker, но его нельзя заменить, так как это приведёт к превышению maximumPoolSize, выбрасывается исключениеRejectedExecutionException. Однако, если этот предикат возвращаетtrue, исключение не выбрасывается, и пул продолжает работу с количеством выполняемых потоков меньше целевого, что может не обеспечить прогресс. -
keepAliveTime— время с момента последнего использования, по истечении которого поток завершается (а затем при необходимости заменяется). Чтобы использовать значение по умолчанию, укажите60, TimeUnit.SECONDS. -
unit— единица времени для аргументаkeepAliveTime - Исключения:
-
IllegalArgumentException— если параллелизм меньше или равен нулю либо превышает ограничение реализации, если maximumPoolSize меньше параллелизма или если keepAliveTime меньше или равен нулю. -
NullPointerException— если фабрика равна null - Начиная с:
- 9
Подробное описание методов
commonPool
public static ForkJoinPool commonPool()
shutdown() или shutdownNow() не влияют на его состояние выполнения. Однако этот пул и все выполняющиеся в нём операции автоматически завершаются при вызове System.exit(int) программы. Любая программа, которой для завершения до выхода требуется обработка асинхронных задач, должна перед выходом вызвать commonPool().awaitQuiescence.- Возвращает:
- экземпляр общего пула
- Начиная с:
- 1.8
invoke
public <T> T invoke(ForkJoinTask<T> task)
ex.printStackTrace()) как текущего потока, так и потока, в котором фактически возникло исключение; как минимум содержится трассировка последнего.- Параметры типа:
T— тип результата задачи- Параметры:
-
task— задача - Возвращает:
- результат задачи
- Исключения:
-
NullPointerException— если задача равна null -
RejectedExecutionException— если задачу невозможно запланировать для выполнения
execute
public void execute(ForkJoinTask<?> task)
- Параметры:
-
task— задача - Исключения:
-
NullPointerException— если задача равна null -
RejectedExecutionException— если задачу невозможно запланировать для выполнения
execute
public void execute(Runnable task)
ExecutorExecutor.- Определено в:
-
executeв интерфейсеExecutor - Параметры:
-
task— задача Runnable - Исключения:
-
NullPointerException— если задача равна null -
RejectedExecutionException— если задачу невозможно запланировать для выполнения
submit
public <T> ForkJoinTask<T> submit(ForkJoinTask<T> task)
- Требования к реализации:
- Этот метод эквивалентен
externalSubmit(ForkJoinTask), если вызывается из потока, не принадлежащего этому пулу. - Параметры типа:
T— тип результата задачи- Параметры:
-
task— отправляемая задача - Возвращает:
- задачу
- Исключения:
-
NullPointerException— если задача равна null -
RejectedExecutionException— если задачу невозможно запланировать для выполнения
submit
public <T> ForkJoinTask<T> submit(Callable<T> task)
ExecutorServiceget объекта Future вернёт результат задачи после успешного завершения. Если вы хотите сразу заблокировать выполнение в ожидании задачи, можно использовать конструкции вида result = exec.submit(aCallable).get();
Примечание: класс Executors содержит набор методов, преобразующих некоторые другие распространённые объекты, подобные замыканиям, например PrivilegedAction, в форму Callable, чтобы их можно было отправить на выполнение.
- Определено в:
-
submitв интерфейсеExecutorService - Переопределяет:
-
submitв классеAbstractExecutorService - Параметры типа:
T— тип результата задачи- Параметры:
-
task— отправляемая задача - Возвращает:
- Future, представляющий ожидающее завершение задачи
- Исключения:
-
NullPointerException— если задача равна null -
RejectedExecutionException— если задачу невозможно запланировать для выполнения
submit
public <T> ForkJoinTask<T> submit(Runnable task, T result)
ExecutorServiceget объекта Future вернёт указанный результат после успешного завершения.- Определено в:
-
submitв интерфейсеExecutorService - Переопределяет:
-
submitв классеAbstractExecutorService - Параметры типа:
T— тип результата- Параметры:
-
task— отправляемая задача -
result— возвращаемый результат - Возвращает:
- Future, представляющий ожидающее завершение задачи
- Исключения:
-
NullPointerException— если задача равна null -
RejectedExecutionException— если задачу невозможно запланировать для выполнения
submit
public ForkJoinTask<?> submit(Runnable task)
ExecutorServiceget объекта Future вернёт null после успешного завершения.- Определено в:
-
submitв интерфейсеExecutorService - Переопределяет:
-
submitв классеAbstractExecutorService - Параметры:
-
task— отправляемая задача - Возвращает:
- Future, представляющий ожидающее завершение задачи
- Исключения:
-
NullPointerException— если задача равна null -
RejectedExecutionException— если задачу невозможно запланировать для выполнения
externalSubmit
public <T> ForkJoinTask<T> externalSubmit(ForkJoinTask<T> task)
ForkJoinTask. Задача добавляется в очередь планирования для отправленных задач пула, даже если вызов выполнен из потока этого пула.- Требования к реализации:
- Этот метод эквивалентен
submit(ForkJoinTask), если вызывается из потока, не принадлежащего этому пулу. - Параметры типа:
T— тип результата задачи- Параметры:
-
task— отправляемая задача - Возвращает:
- задачу
- Исключения:
-
NullPointerException— если задача равна null -
RejectedExecutionException— если задачу невозможно запланировать для выполнения - Начиная с:
- 20
lazySubmit
public <T> ForkJoinTask<T> lazySubmit(ForkJoinTask<T> task)
- Параметры типа:
T— тип результата задачи- Параметры:
-
task— задача - Возвращает:
- задачу
- Исключения:
-
NullPointerException— если задача равна null -
RejectedExecutionException— если задачу невозможно запланировать для выполнения - Начиная с:
- 19
setParallelism
public int setParallelism(int size)
- Примечание к реализации:
- Эта реализация ограничивает максимальное количество работающих потоков значением 32767
- Параметры:
-
size— целевой уровень параллелизма - Возвращает:
- предыдущий уровень параллелизма.
- Исключения:
-
IllegalArgumentException— если размер меньше 1 или превышает максимум, поддерживаемый этим пулом. -
UnsupportedOperationException— этот пул являетсяcommonPool(), а уровень параллелизма задан системным свойствомjava.util.concurrent.ForkJoinPool.common.parallelism. - Начиная с:
- 19
invokeAllUninterruptibly
public <T> List<Future<T>> invokeAllUninterruptibly(Collection<? extends Callable<T>> tasks)
invokeAll, не прерываемая прерываниями. Выполняет указанные задачи и возвращает список объектов Future с их состояниями и результатами после завершения всех задач, игнорируя прерывания. Для каждого элемента возвращённого списка значение Future.isDone() равно true. Обратите внимание: завершённая задача могла завершиться как нормально, так и с выбросом исключения. Результаты этого метода не определены, если указанная коллекция изменяется во время выполнения операции.- Примечание к API:
- Этот метод поддерживает сценарии использования, которые ранее полагались на несовместимое переопределение
ExecutorService.invokeAll(java.util.Collection). - Параметры типа:
T— тип значений, возвращаемых задачами- Параметры:
-
tasks— коллекция задач - Возвращает:
- список объектов Future, представляющих задачи, в том же последовательном порядке, что и итератор указанного списка задач; все задачи в списке завершены
- Исключения:
-
NullPointerException— если задачи или любой из их элементов равныnull -
RejectedExecutionException— если какую-либо задачу невозможно запланировать для выполнения - Начиная с:
- 22
invokeAll
public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException
ExecutorServiceFuture.isDone() равно true. Обратите внимание: завершённая задача могла завершиться как нормально, так и с выбросом исключения. Результаты этого метода не определены, если указанная коллекция изменяется во время выполнения операции.- Определено в:
-
invokeAllв интерфейсеExecutorService - Переопределяет:
-
invokeAllв классеAbstractExecutorService - Параметры типа:
T— тип значений, возвращаемых задачами- Параметры:
-
tasks— коллекция задач - Возвращает:
- список объектов Future, представляющих задачи, в том же последовательном порядке, что и итератор указанного списка задач; все задачи в списке завершены
- Исключения:
-
InterruptedException— если во время ожидания произошло прерывание; в этом случае незавершённые задачи отменяются
invokeAll
public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException
ExecutorServiceFuture.isDone() равно true. При возврате незавершённые задачи отменяются. Обратите внимание: завершённая задача могла завершиться как нормально, так и с выбросом исключения. Результаты этого метода не определены, если указанная коллекция изменяется во время выполнения операции.- Определено в:
-
invokeAllв интерфейсеExecutorService - Переопределяет:
-
invokeAllв классеAbstractExecutorService - Параметры типа:
T— тип значений, возвращаемых задачами- Параметры:
-
tasks— коллекция задач -
timeout— максимальное время ожидания -
unit— единица времени для аргумента времени ожидания - Возвращает:
- список объектов Future, представляющих задачи, в том же последовательном порядке, что и итератор указанного списка задач. Если время ожидания не истекло, все задачи будут завершены. Если оно истекло, некоторые задачи не будут завершены.
- Исключения:
-
InterruptedException— если во время ожидания произошло прерывание; в этом случае незавершённые задачи отменяются
invokeAny
public <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException
ExecutorService- Определено в:
-
invokeAnyв интерфейсеExecutorService - Переопределяет:
-
invokeAnyв классеAbstractExecutorService - Параметры типа:
T— тип значений, возвращаемых задачами- Параметры:
-
tasks— коллекция задач - Возвращает:
- результат, возвращённый одной из задач
- Исключения:
-
InterruptedException— если во время ожидания произошло прерывание -
ExecutionException— если ни одна задача не завершилась успешно
invokeAny
public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
ExecutorService- Определено в:
-
invokeAnyв интерфейсеExecutorService - Переопределяет:
-
invokeAnyв классеAbstractExecutorService - Параметры типа:
T— тип значений, возвращаемых задачами- Параметры:
-
tasks— коллекция задач -
timeout— максимальное время ожидания -
unit— единица времени для аргумента времени ожидания - Возвращает:
- результат, возвращённый одной из задач
- Исключения:
-
InterruptedException— если во время ожидания произошло прерывание -
ExecutionException— если ни одна задача не завершилась успешно -
TimeoutException— если указанное время ожидания истекло до успешного завершения какой-либо задачи
schedule
public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit)
shutdownNow() или если пул находится в состоянии shutdown(), в противном случае неактивен и действует параметр cancelDelayedTasksOnShutdown().- Определено в:
-
scheduleв интерфейсеScheduledExecutorService - Параметры:
-
command— выполняемая задача -
delay— задержка выполнения относительно текущего момента -
unit— единица времени для параметра задержки - Возвращает:
- ForkJoinTask, реализующий интерфейс ScheduledFuture; его метод
get()вернётnullпри нормальном завершении. - Исключения:
-
RejectedExecutionException— если пул остановлен или при отправке задачи исчерпаны ресурсы. -
NullPointerException— если команда или единица измерения равна null - Начиная с:
- 25
schedule
public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit)
shutdownNow() или если пул находится в состоянии shutdown(), в противном случае неактивен и действует параметр cancelDelayedTasksOnShutdown().- Определено в:
-
scheduleв интерфейсеScheduledExecutorService - Параметры типа:
V— тип результата Callable- Параметры:
-
callable— выполняемая функция -
delay— задержка выполнения относительно текущего момента -
unit— единица времени для параметра задержки - Возвращает:
- ForkJoinTask, реализующий интерфейс ScheduledFuture; его метод
get()вернёт значение, возвращённое Callable, при нормальном завершении. - Исключения:
-
RejectedExecutionException— если пул остановлен или при отправке задачи исчерпаны ресурсы. -
NullPointerException— если команда или единица измерения равна null - Начиная с:
- 25
scheduleAtFixedRate
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
initialDelay, затем initialDelay + period, затем initialDelay + 2 * period и так далее. Последовательность выполнений задачи продолжается бесконечно, пока не произойдёт одно из следующих исключительных завершений:
- Задача явно отменена
- Вызван метод
shutdownNow() - Вызван метод
shutdown(), и пул находится в состоянии покоя; в этом случае уже начавшиеся выполнения продолжаются, но последующие выполнения не запускаются. - Во время выполнения или в самой задаче возникает нехватка ресурсов.
- При выполнении задачи возникает исключение. В этом случае вызов метода
getу возвращённого future приведёт к выбросуExecutionException, содержащего это исключение в качестве причины.
isDone() у возвращённого future будут возвращать true. Если выполнение этой задачи длится дольше её периода, последующие выполнения могут начаться с опозданием, но не будут выполняться параллельно.
- Определено в:
-
scheduleAtFixedRateв интерфейсеScheduledExecutorService - Параметры:
-
command- задача для выполнения -
initialDelay- время задержки перед первым выполнением -
period- период между последовательными выполнениями -
unit- единица измерения параметров initialDelay и period - Возвращает:
- ForkJoinTask, реализующий интерфейс ScheduledFuture. Метод
get()у future никогда не вернётся нормально и выбросит исключение при отмене задачи или ненормальном завершении её выполнения. - Выбрасывает:
-
RejectedExecutionException- если пул остановлен или при отправке задачи возникает нехватка ресурсов. -
NullPointerException- если command или unit равен null -
IllegalArgumentException- если period меньше или равен нулю - Начиная с:
- 25
scheduleWithFixedDelay
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
Последовательность выполнений задачи продолжается бесконечно, пока не произойдёт одно из следующих исключительных завершений:
- Задача явно отменена
- Вызван метод
shutdownNow() - Вызван метод
shutdown(), и пул находится в состоянии покоя; в этом случае уже начавшиеся выполнения продолжаются, но последующие выполнения не запускаются. - Во время выполнения или в самой задаче возникает нехватка ресурсов.
- При выполнении задачи возникает исключение. В этом случае вызов метода
getу возвращённого future приведёт к выбросуExecutionException, содержащего это исключение в качестве причины.
isDone() у возвращённого future будут возвращать true.- Определено в:
-
scheduleWithFixedDelayв интерфейсеScheduledExecutorService - Параметры:
-
command- задача для выполнения -
initialDelay- время задержки перед первым выполнением -
delay- задержка между завершением одного выполнения и началом следующего -
unit- единица измерения параметров initialDelay и delay - Возвращает:
- ForkJoinTask, реализующий интерфейс ScheduledFuture. Метод
get()у future никогда не вернётся нормально и выбросит исключение при отмене задачи или ненормальном завершении её выполнения. - Выбрасывает:
-
RejectedExecutionException- если пул остановлен или при отправке задачи возникает нехватка ресурсов. -
NullPointerException- если command или unit равен null -
IllegalArgumentException- если delay меньше или равен нулю - Начиная с:
- 25
submitWithTimeout
public <V> ForkJoinTask<V> submitWithTimeout(Callable<V> callable, long timeout, TimeUnit unit, Consumer<? super ForkJoinTask<V>> timeoutAction)
timeoutAction равен null, задача отменяется (с помощью
cancel(true)). В противном случае выполняется это действие, и выполняющаяся задача может быть прервана. Действие может включать вызов ForkJoinTask.complete(V) для задания замещающего значения или ForkJoinTask.completeExceptionally(Throwable) для выброса соответствующего исключения. Обратите внимание, что эти вызовы могут завершиться успешно, только если задача ещё не завершилась к моменту выполнения timeoutAction.- Параметры типа:
V- тип результата callable- Параметры:
-
callable- функция для выполнения -
timeout- время ожидания перед отменой, если задача не завершена -
unit- единица измерения параметра timeout -
timeoutAction- если не равен null, действие при истечении времени ожидания; в противном случае по умолчанию выполняется отмена с помощьюcancel(true). - Возвращает:
- Future, который можно использовать для получения результата или отмены задачи
- Выбрасывает:
-
RejectedExecutionException- если не удаётся запланировать выполнение задачи -
NullPointerException- если callable или unit равен null - Начиная с:
- 25
cancelDelayedTasksOnShutdown
public void cancelDelayedTasksOnShutdown()
shutdown() (если только этот пул не является commonPool(), который никогда не останавливается). Этот метод можно вызвать до shutdown(), чтобы настройка вступила в силу при следующем вызове, либо после него, чтобы отменить такие задачи, что может позволить пулу завершить работу. Обратите внимание, что при остановке последующие выполнения периодических задач всегда отключаются, поэтому этот метод имеет смысл только для непериодических задач.- Начиная с:
- 25
getFactory
public ForkJoinPool.ForkJoinWorkerThreadFactory getFactory()
- Возвращает:
- фабрику, используемую для создания новых рабочих потоков
getUncaughtExceptionHandler
public Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()
- Возвращает:
- обработчик или
null, если его нет
getParallelism
public int getParallelism()
- Возвращает:
- целевой уровень параллелизма этого пула
getCommonPoolParallelism
public static int getCommonPoolParallelism()
- Возвращает:
- целевой уровень параллелизма общего пула
- Начиная с:
- 1.8
getPoolSize
public int getPoolSize()
getParallelism(), если потоки создаются для поддержания параллелизма, пока другие потоки заблокированы с возможностью совместной работы.- Возвращает:
- количество рабочих потоков
getAsyncMode
public boolean getAsyncMode()
true, если этот пул использует локальный режим планирования «первым пришёл — первым обслужен» для разветвлённых задач, которые никогда не объединяются.- Возвращает:
-
true, если этот пул использует асинхронный режим
getRunningThreadCount
public int getRunningThreadCount()
- Возвращает:
- количество рабочих потоков
getActiveThreadCount
public int getActiveThreadCount()
- Возвращает:
- количество активных потоков
isQuiescent
public boolean isQuiescent()
true, если все рабочие потоки в данный момент бездействуют. Бездействующий рабочий поток — это поток, который не может получить задачу для выполнения, поскольку в очередях нет задач для перехвата другими потоками и в пуле нет ожидающих отправки задач. Этот метод возвращает консервативный результат: он может не вернуть true сразу после того, как все потоки перейдут в состояние бездействия, но со временем вернёт его, если потоки останутся неактивными.- Возвращает:
-
true, если все потоки в данный момент бездействуют
getStealCount
public long getStealCount()
- Возвращает:
- количество перехватов
getQueuedTaskCount
public long getQueuedTaskCount()
getDelayedTaskCount().- Возвращает:
- количество задач в очередях
- См. также:
getQueuedSubmissionCount
public int getQueuedSubmissionCount()
- Возвращает:
- количество отправленных задач в очереди
getDelayedTaskCount
public long getDelayedTaskCount()
- Возвращает:
- оценку количества отложенных задач
- Начиная с:
- 25
hasQueuedSubmissions
public boolean hasQueuedSubmissions()
true, если в этот пул были отправлены задачи, которые ещё не начали выполняться.- Возвращает:
-
true, если в очереди есть отправленные задачи
pollSubmission
protected ForkJoinTask<?> pollSubmission()
- Возвращает:
- следующую отправленную задачу или
null, если такой нет
drainTasksTo
protected int drainTasksTo(Collection<? super ForkJoinTask<?>> c)
c может привести к тому, что при выбросе соответствующего исключения элементы не будут находиться ни в одной из коллекций, будут находиться в одной из них или в обеих. Поведение этой операции не определено, если указанная коллекция изменяется во время выполнения операции.- Параметры:
-
c- коллекция, в которую переносятся элементы - Возвращает:
- количество перенесённых элементов
toString
shutdown
public void shutdown()
commonPool(), и не оказывает дополнительного эффекта, если пул уже остановлен. Задачи, отправка которых происходит одновременно с выполнением этого метода, могут быть отклонены или приняты.- Определено в:
-
shutdownв интерфейсеExecutorService
shutdownNow
public List<Runnable> shutdownNow()
commonPool(), и не оказывает дополнительного эффекта, если пул уже остановлен. В противном случае задачи, отправка или выполнение которых происходит одновременно с выполнением этого метода, могут быть отклонены или приняты. Этот метод отменяет как уже выполняющиеся, так и ещё не выполненные задачи, чтобы обеспечить завершение работы при наличии зависимостей между задачами. Поэтому метод всегда возвращает пустой список (в отличие от поведения некоторых других Executors).- Определено в:
-
shutdownNowв интерфейсеExecutorService - Возвращает:
- пустой список
isTerminated
public boolean isTerminated()
true, если после остановки все задачи завершились.- Определено в:
-
isTerminatedв интерфейсеExecutorService - Возвращает:
-
true, если после остановки все задачи завершились
isTerminating
public boolean isTerminating()
true, если процесс завершения работы начался, но ещё не закончился. Этот метод может быть полезен для отладки. Если через достаточно длительное время после остановки метод возвращает true, это может указывать на то, что отправленные задачи игнорируют или подавляют прерывание либо ожидают ввода-вывода, из-за чего этот исполнитель не может корректно завершить работу. (См. рекомендации в документации класса ForkJoinTask, согласно которым задачи обычно не должны выполнять блокирующие операции. Если же они это делают, то должны прерывать их при получении сигнала прерывания.)- Возвращает:
-
true, если завершение работы началось, но ещё не закончилось
isShutdown
public boolean isShutdown()
true, если работа этого пула остановлена.- Определено в:
-
isShutdownв интерфейсеExecutorService - Возвращает:
-
true, если работа этого пула остановлена
awaitTermination
public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
commonPool() не завершается до остановки программы, при вызове для общего пула этот метод эквивалентен awaitQuiescence(long, TimeUnit), но всегда возвращает false.- Определено в:
-
awaitTerminationв интерфейсеExecutorService - Параметры:
-
timeout- максимальное время ожидания -
unit- единица измерения аргумента timeout - Возвращает:
-
true, если работа этого исполнителя завершилась, иfalse, если время ожидания истекло до завершения работы - Выбрасывает:
-
InterruptedException- если во время ожидания произошло прерывание
awaitQuiescence
public boolean awaitQuiescence(long timeout, TimeUnit unit)
ForkJoinTask.helpQuiesce(). В противном случае метод ожидает и/или пытается помочь с выполнением задач, пока этот пул не isQuiescent() или не истечёт указанный период ожидания.- Параметры:
-
timeout- максимальное время ожидания -
unit- единица измерения аргумента timeout - Возвращает:
-
true, если пул находится в состоянии покоя;false, если время ожидания истекло.
close
public void close()
commonPool(), начинает штатное завершение работы, при котором ранее отправленные задачи выполняются, но новые задачи не принимаются, и ожидает завершения всех задач и остановки исполнителя. Если работа уже завершена или это commonPool(), метод не влияет на выполнение и не ждёт завершения. В противном случае, если во время ожидания возникает прерывание, метод останавливает все выполняющиеся задачи, как если бы был вызван shutdownNow(). Затем он продолжает ожидание до завершения всех активно выполняющихся задач. Задачи, ожидавшие выполнения, не запускаются. Перед возвратом из метода статус прерывания будет восстановлен.
- Определено в:
-
closeв интерфейсеAutoCloseable - Определено в:
-
closeв интерфейсеExecutorService - Начиная с:
- 19
managedBlock
public static void managedBlock(ForkJoinPool.ManagedBlocker blocker) throws InterruptedException
blocker.block(). Метод повторно вызывает blocker.isReleasable() и blocker.block(), пока один из методов не вернёт true. Каждому вызову blocker.block() предшествует вызов blocker.isReleasable(), вернувший false.
Если выполнение происходит не в ForkJoinPool, поведение этого метода эквивалентно следующему:
while (!blocker.isReleasable())
if (blocker.block())
break; Если выполнение происходит в ForkJoinPool, пул может быть предварительно расширен, чтобы обеспечить достаточный параллелизм во время вызова blocker.block().- Параметры:
-
blocker- блокирующая задача - Выбрасывает:
-
InterruptedException- если это сделалblocker.block()
© 1993, 2025, 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/25/docs/api/java.base/java/util/concurrent/ForkJoinPool.html