Класс ForkJoinPool
- Все реализованные интерфейсы:
AutoCloseable, Executor, ExecutorService, ScheduledExecutorService
public class ForkJoinPool extends AbstractExecutorService implements ScheduledExecutorService
ExecutorService для выполнения задач ForkJoinTask. ForkJoinPool предоставляет точку входа для отправки задач клиентами, не являющимися ForkJoinTask, а также операции управления и мониторинга. ForkJoinPool отличается от других видов ExecutorService главным образом тем, что использует work-stealing (похищение задач): все потоки в пуле пытаются найти и выполнить задачи, отправленные в пул и/или созданные другими активными задачами (в конечном счёте блокируясь в ожидании работы, если её нет). Это обеспечивает эффективную обработку, когда большинство задач порождают другие подзадачи (как и большинство ForkJoinTask), а также когда множество небольших задач отправляется в пул внешними клиентами. В частности, при установке параметра asyncMode в значение true в конструкторах
ForkJoinPool могут быть также подходящими для использования с задачами в стиле событий, которые никогда не объединяются. Все рабочие потоки инициализируются с установленным в true значением Thread.isDaemon().
Доступен статический commonPool(), подходящий для большинства приложений. Общий пул используется любой задачей ForkJoinTask, которая явно не отправлена в указанный пул. Использование общего пула обычно сокращает потребление ресурсов (его потоки постепенно освобождаются в периоды бездействия и восстанавливаются при последующем использовании).
Для приложений, которым нужны отдельные или настраиваемые пулы, можно создать
ForkJoinPool с заданным уровнем параллелизма; по умолчанию он равен числу доступных процессоров. Пул пытается поддерживать достаточное количество активных (или доступных) потоков, динамически добавляя, приостанавливая или возобновляя внутренние рабочие потоки, даже если некоторые задачи ожидают объединения с другими. Однако такие корректировки не гарантируются при блокирующем вводе-выводе или другой неуправляемой синхронизации. Вложенный интерфейс ForkJoinPool.ManagedBlocker позволяет расширить набор поддерживаемых видов синхронизации. Политики по умолчанию можно переопределить с помощью конструктора с параметрами, соответствующими описанным в классе ThreadPoolExecutor.
Помимо методов выполнения задач и управления жизненным циклом, этот класс предоставляет методы проверки состояния (например, getStealCount()), предназначенные для помощи в разработке, настройке и мониторинге приложений fork/join. Кроме того, метод toString() возвращает сведения о состоянии пула в удобной для неформального мониторинга форме.
Как и в случае с другими ExecutorService, существуют три основных метода выполнения задач, перечисленные в следующей таблице. Они предназначены прежде всего для клиентов, которые ещё не участвуют в вычислениях fork/join в текущем пуле. Основные формы этих методов принимают экземпляры ForkJoinTask, но перегруженные формы также позволяют смешивать выполнение задач на основе обычных
Runnable или Callable. Однако уже выполняющиеся в пуле задачи обычно должны использовать формы для вызова из вычисления, перечисленные в таблице, если только это не асинхронные задачи в стиле событий, которые обычно не объединяются; в этом случае выбор метода не имеет большого значения.
| Вызов из клиента, не участвующего в fork/join | Вызов из вычисления fork/join | |
|---|---|---|
| Запланировать асинхронное выполнение | execute(ForkJoinTask)
| ForkJoinTask.fork()
|
| Дождаться результата и получить его | invoke(ForkJoinTask)
| ForkJoinTask.invoke()
|
| Запланировать выполнение и получить Future | submit(ForkJoinTask)
| ForkJoinTask.fork() (ForkJoinTask — это Future) |
Кроме того, этот класс поддерживает методы ScheduledExecutorService для отложенного или периодического выполнения задач, а также метод submitWithTimeout(Callable, long, TimeUnit, Consumer) для отмены задач, выполнение которых занимает слишком много времени. Запланированные функции или действия могут создавать и вызывать другие ForkJoinTask. Отложенные действия становятся доступными для выполнения и ведут себя как обычные отправленные задачи по истечении задержки. Методы планирования возвращают ForkJoinTask, реализующие интерфейс 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 |
Удаляет из очередей планирования все доступные невыполненные отправленные и разветвлённые задачи и добавляет их в указанную коллекцию, не изменяя их состояние выполнения. |
void |
execute |
Выполняет указанную команду в некоторый момент в будущем. |
void |
execute |
Организует (асинхронное) выполнение указанной задачи. |
<T> ForkJoinTask |
externalSubmit |
Отправляет указанную задачу так, как если бы она была отправлена клиентом, не являющимся ForkJoinTask. |
int |
getActiveThreadCount() |
Возвращает оценку числа потоков, которые в данный момент похищают или выполняют задачи. |
boolean |
getAsyncMode() |
Возвращает true, если в этом пуле используется локальный режим планирования «первым поступил — первым обслужен» для разветвлённых задач, которые никогда не объединяются. |
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 |
invokeAllUninterruptibly |
Версия invokeAll, не реагирующая на прерывания. |
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 |
Отправляет задачу, выполняющую указанную функцию, и отменяет её или выполняет указанное действие при истечении времени ожидания, если задача не завершилась за отведённый период. |
String |
toString() |
Возвращает строку, идентифицирующую этот пул и его состояние, включая сведения о состоянии выполнения, уровне параллелизма, а также количестве рабочих потоков и задач. |
Методы, объявленные в классе AbstractExecutorService
invokeAll, invokeAll, invokeAny, invokeAny, newTaskFor, newTaskFor | Модификатор и тип | Метод | Описание |
|---|---|---|
<T> List |
invokeAll |
Выполняет указанные задачи и возвращает список Future с их состояниями и результатами после завершения всех задач. |
<T> List |
invokeAll |
Выполняет указанные задачи и возвращает список Future с их состояниями и результатами после завершения всех задач или истечения времени ожидания — в зависимости от того, что произойдёт раньше. |
<T> T |
invokeAny |
Выполняет указанные задачи и возвращает результат одной из них, завершившейся успешно (то есть без исключения), если такая задача есть. |
<T> T |
invokeAny |
Выполняет указанные задачи и возвращает результат одной из них, завершившейся успешно (то есть без исключения), если такая задача есть до истечения указанного времени ожидания. |
protected <T> RunnableFuture |
newTaskFor |
Возвращает RunnableFuture для указанного объекта Runnable и значения по умолчанию. |
protected <T> RunnableFuture |
newTaskFor |
Возвращает RunnableFuture для указанной задачи Callable. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создаёт и возвращает копию этого объекта. |
boolean |
equals |
Указывает, является ли другой объект «равным» этому объекту. |
protected void |
finalize() |
Устарело, будет удалено: этот элемент API может быть удалён в будущей версии. Финализация объявлена устаревшей и может быть удалена в одном из будущих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
int |
hashCode() |
Возвращает хеш-код этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно вследствие вызова notify или interrupt. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно вследствие вызова notify или interrupt, либо до истечения указанного промежутка реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно вследствие вызова notify или interrupt, либо до истечения указанного промежутка реального времени. |
Подробное описание полей
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— выполняемая задача - Исключения:
-
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— если tasks или любой из ее элементов равенnull -
RejectedExecutionException— если какую-либо задачу невозможно запланировать для выполнения - Начиная с версии:
- 22
schedule
public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit)
shutdownNow(), либо вызовом shutdown() при отсутствии другой работы, когда действует cancelDelayedTasksOnShutdown().- Определено в:
-
scheduleв интерфейсеScheduledExecutorService - Параметры:
-
command— задача для выполнения -
delay— задержка выполнения относительно текущего момента -
unit— единица измерения времени для параметра задержки - Возвращает:
- ForkJoinTask, реализующий интерфейс ScheduledFuture; его метод
get()вернетnullпри нормальном завершении. - Исключения:
-
RejectedExecutionException— если пул остановлен или при отправке задачи возникла нехватка ресурсов. -
NullPointerException— если command или unit равен 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— если command или unit равен 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— единица измерения времени для параметра тайм-аута -
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(), и не оказывает дополнительного эффекта, если работа уже завершена. В противном случае задачи, отправка или выполнение которых происходит параллельно с выполнением этого метода, могут быть как отклонены, так и приняты. Этот метод отменяет как существующие, так и ещё не выполненные задачи, чтобы обеспечить возможность завершения работы при наличии зависимостей между задачами. Поэтому метод всегда возвращает пустой список (в отличие от некоторых других Executor).- Определено в:
-
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— единица измерения времени для аргумента времени ожидания - Возвращает:
-
true, если работа этого исполнителя завершилась, иfalse, если время ожидания истекло до завершения работы - Выбрасывает:
-
InterruptedException— если поток был прерван во время ожидания
awaitQuiescence
public boolean awaitQuiescence(long timeout, TimeUnit unit)
ForkJoinTask.helpQuiesce(). В противном случае ожидает и/или пытается помочь выполнить задачи, пока пул не isQuiescent() или не истечёт указанный период ожидания.- Параметры:
-
timeout— максимальное время ожидания -
unit— единица измерения времени для аргумента времени ожидания - Возвращает:
-
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.