Spec-Zone .ru
спецификации, руководства, описания, API
|
public abstract class ForkJoinTask<V> extends Object implements Future<V>, Serializable
ForkJoinPool
. A ForkJoinTask
нитевидный объект, который является намного более легким весом чем нормальный поток. Огромные числа задач и подзадач могут быть размещены небольшим количеством фактических потоков в ForkJoinPool по цене некоторых ограничений использования. "Основное" ForkJoinTask
начинает выполнение когда представлено a ForkJoinPool
. После того, как запущенный, это будет обычно поочередно запускать другие подзадачи. Как обозначено именем этого класса, многого использования программ ForkJoinTask
используйте только методы fork()
и join()
, или производные такой как invokeAll
. Однако, этот класс также обеспечивает много других методов, которые могут играть роль в усовершенствованных использованиях, так же как механике расширения, которые позволяют поддержку новых форм обработки ветвления/соединения.
A ForkJoinTask
легкая форма Future
. Эффективность ForkJoinTask
s происходит от ряда ограничений (которые только частично статически осуществимы), отражение их намеченного использования в качестве вычислительных задач, вычисляющих чистые функции или работающих на просто изолированных объектах. Основные механизмы координации fork()
, это располагает асинхронное выполнение, и join()
, это не продолжается, пока результат задачи не был вычислен. Вычисления должны избежать synchronized
методы или блоки, и должны минимизировать другую синхронизацию блокирования кроме присоединения к другим задачам или использования синхронизаторов, таких как Фазовращатели, которые рекламируются, чтобы сотрудничать с планированием ветвления/соединения. Задачи не должны также выполнить блокирование IO, и если идеально переменные доступа, которые абсолютно независимы от тех, к которым получают доступ другие выполняющиеся задачи. Незначительные нарушения этих ограничений, например используя совместно использованные потоки вывода, могут быть терпимыми практически, но частое использование может привести к низкой производительности, и потенциалу, чтобы неопределенно остановиться, если число потоков, не ожидая IO или другой внешней синхронизации становится исчерпанным. Это ограничение использования частично осуществляется, не разрешая проверенные исключения такой как IOExceptions
быть брошенным. Однако, вычисления могут все еще встретиться с исключениями непроверенными, которые повторно бросаются в вызывающие стороны, пытающиеся присоединиться к ним. Эти исключения могут дополнительно включать RejectedExecutionException
происходя от внутреннего исчерпания ресурса, такого как отказ выделить внутренние очереди задачи. Повторно брошенные исключения ведут себя таким же образом как регулярные исключения, но, когда возможный, содержат трассировки стека (как выведено на экран например использование ex.printStackTrace()
) из обоих поток, который инициировал вычисление так же как поток, фактически встречающийся с исключением; минимально только последний.
Основной метод для того, чтобы ждать завершения и извлечь результаты задачи join()
, но есть несколько разновидностей: Future.get()
методы поддерживают прерывистый, и/или синхронизированный ожидает завершения и использования результатов отчета Future
соглашения. Метод invoke()
семантически эквивалентно fork(); join()
но всегда попытки начать выполнение в текущем потоке. "Тихие" формы этих методов не извлекают результаты или сообщают об исключениях. Они могут быть полезными, когда ряд задач выполняется, и Вы должны задержать обработку результатов или исключений, пока все не завершаются. Метод invokeAll
(доступный в многократных версиях), выполняет наиболее распространенную форму параллельного вызова: разветвление ряда задач и присоединения к ним всем.
Состояние выполнения задач может быть запрошено в нескольких уровнях детализации: isDone()
истина, если задача, завершенная всегда (включая случай, где задача была отменена, не выполняясь); isCompletedNormally()
истина если задача, завершенная без отмены или обнаружения с исключением; isCancelled()
истина, если задача была отменена (когда getException()
возвраты a CancellationException
); и isCompletedAbnormally()
истина, если задача была или отменена или встретилась с исключением, когда getException()
возвратит или исключение, с которым встречаются, или CancellationException
.
Класс ForkJoinTask обычно непосредственно не разделяется на подклассы. Вместо этого Вы разделяете один на подклассы из абстрактных классов, которые поддерживают определенный стиль обработки ветвления/соединения, обычно RecursiveAction
для вычислений, которые не возвращают результаты, или RecursiveTask
для тех, которые делают. Обычно, конкретный подкласс ForkJoinTask объявляет поля, включающие его параметры, установленные в конструкторе, и затем определяет a compute
метод, который так или иначе использует способы управления, предоставленные этим базовым классом. В то время как эти методы имеют public
доступ (чтобы позволить экземплярам различных подклассов задачи вызывать методы друг друга), некоторых из них можно только вызвать изнутри другого ForkJoinTasks (как может быть определен, используя метод inForkJoinPool()
). Попытки вызвать их в других контекстах приводят к исключениям или ошибкам, возможно включая ClassCastException
.
Метод join()
и его разновидности являются подходящими для использования только, когда зависимости от завершения являются нециклическими; то есть, параллельное вычисление может быть описано как направленный граф без петель (DAG). Иначе, выполнение может встретиться с формой мертвой блокировки, поскольку задачи циклически ожидают друг друга. Однако, эта платформа поддерживает другие методы и методы (например использование Phaser
, helpQuiesce()
, и complete(V)
) это может быть полезным в построении пользовательских подклассов для проблем, которые статически не структурируются как DAGs.
Большинство основных методов поддержки final
, предотвратить переопределение реализаций, которые свойственно связываются к базовой легкой платформе планирования задач. Разработчики, создающие новые основные стили обработки ветвления/соединения, должны минимально реализовать protected
методы exec()
, setRawResult(V)
, и getRawResult()
, также представляя абстрактный вычислительный метод, который может быть реализован в его подклассах, возможно полагаясь на другой protected
методы обеспечили этим классом.
ForkJoinTasks должен выполнить относительно небольшие количества вычисления. Большие задачи должны быть разделены на меньшие подзадачи, обычно через рекурсивное разложение. Как очень грубое эмпирическое правило, задача должна выполнить больше чем 100 и меньше чем 10000 основных вычислительных шагов, и должна избежать неопределенного цикличного выполнения. Если задачи являются слишком большими, то параллелизм не может улучшить пропускную способность. Если слишком маленький, то память и внутренние издержки обслуживания задачи могут сокрушить обработку.
Этот класс обеспечивает adapt
методы для Runnable
и Callable
, это может быть полезным, смешивая выполнение ForkJoinTasks
с другими видами задач. Когда все задачи имеют эту форму, рассматривают использование пула, созданного в asyncMode.
ForkJoinTasks Serializable
, который позволяет им использоваться в расширениях, таких как удаленные платформы выполнения. Разумно сериализировать задачи только прежде или после, но не во время, выполнение. На сериализацию не полагаются во время выполнения непосредственно.
Конструктор и Описание |
---|
ForkJoinTask() |
Модификатор и Тип | Метод и Описание |
---|---|
static <T> ForkJoinTask<T> |
adapt(Callable<? extends T> callable)
Возвращает новое
ForkJoinTask это выполняет call метод данного Callable как его действие, и возвраты его результат на join() , преобразование любых проверенных исключений, в которые встречаются RuntimeException . |
static ForkJoinTask<?> |
adapt(Runnable runnable)
Возвращает новое
ForkJoinTask это выполняет run метод данного Runnable как его действие, и возвраты нулевой результат на join() . |
static <T> ForkJoinTask<T> |
adapt(Runnable runnable, T result)
Возвращает новое
ForkJoinTask это выполняет run метод данного Runnable как его действие, и возвраты данный результат на join() . |
boolean |
cancel(boolean mayInterruptIfRunning)
Попытки отменить выполнение этой задачи.
|
void |
complete(V value)
Завершает эту задачу, и если не уже прерванный или отмененный, возвращая данное значение как результат последующих вызовов
join и связанные операции. |
void |
completeExceptionally(Throwable ex)
Завершает эту задачу неправильно, и если не уже прерванный или отмененный, причины это, чтобы выдать данное исключение на
join и связанные операции. |
protected abstract boolean |
exec()
Сразу выполняет основное действие этой задачи.
|
ForkJoinTask<V> |
fork()
Расположения, чтобы асинхронно выполнить эту задачу.
|
V |
get()
Ожидает в случае необходимости вычисления, чтобы завершиться, и затем получает его результат.
|
V |
get(long timeout, TimeUnit unit)
Ожидает в случае необходимости в течение самое большее данного времени для вычисления, чтобы завершиться, и затем получает его результат, при наличии.
|
Throwable |
getException()
Возвращает исключение, выданное основным вычислением, или a
CancellationException если отменено, или null если ни один или если метод еще не завершился. |
static ForkJoinPool |
getPool()
Возвращает пул, размещающий текущее выполнение задачи, или нуль, если эта задача выполняется за пределами какого-либо ForkJoinPool.
|
static int |
getQueuedTaskCount()
Возвращает оценку числа задач, которые были разветвлены текущим рабочим потоком, но еще не выполнены.
|
abstract V |
getRawResult()
Возвращает результат, который был бы возвращен
join() , даже если эта задача завершалась неправильно, или null если эта задача, как известно, не была завершена. |
static int |
getSurplusQueuedTaskCount()
Возвращает оценку того, насколько больше локально задач с очередями сохранено текущим рабочим потоком чем есть другие рабочие потоки, которые могли бы украсть их.
|
static void |
helpQuiesce()
Возможно выполняет задачи до пула, размещающего текущую задачу
is quiescent . |
static boolean |
inForkJoinPool()
Возвраты
true если текущий поток является a ForkJoinWorkerThread выполнение как вычисление ForkJoinPool. |
V |
invoke()
Начинает выполнение этой задачи, ждет ее завершения в случае необходимости, и возвращает ее результат, или бросает (непроверенный)
RuntimeException или Error если базовое вычисление сделало так. |
static <T extends ForkJoinTask<?>> |
invokeAll(Collection<T> tasks)
Ветвления все задачи в указанном наборе, возвращаясь, когда
isDone содержит для каждой задачи, или с исключением (непроверенным) встречаются, когда исключение повторно бросается. |
static void |
invokeAll(ForkJoinTask<?>... tasks)
Разветвляет данные задачи, возвращаясь когда
isDone содержит для каждой задачи, или с исключением (непроверенным) встречаются, когда исключение повторно бросается. |
static void |
invokeAll(ForkJoinTask<?> t1, ForkJoinTask<?> t2)
Разветвляет данные задачи, возвращаясь когда
isDone содержит для каждой задачи, или с исключением (непроверенным) встречаются, когда исключение повторно бросается. |
boolean |
isCancelled()
true возвратов, если эта задача была отменена прежде, чем это обычно завершалось.
|
boolean |
isCompletedAbnormally()
Возвраты
true если эта задача выдавала исключение или была отменена. |
boolean |
isCompletedNormally()
Возвраты
true если эта задача, завершенная, не выдавая исключение и, не была отменена. |
boolean |
isDone()
true возвратов, если эта задача завершалась.
|
V |
join()
Возвращает результат вычисления когда это
is done . |
protected static ForkJoinTask<?> |
peekNextLocalTask()
Возвраты, но не непланирует или выполняется, задача, поставленная в очередь текущим потоком, но еще выполняемый, если Вы будете сразу доступны.
|
protected static ForkJoinTask<?> |
pollNextLocalTask()
Нерасписания и возвраты, без выполнения, следующая задача, поставленная в очередь текущим потоком, но еще выполняемый.
|
protected static ForkJoinTask<?> |
pollTask()
Нерасписания и возвраты, без выполнения, следующая задача, поставленная в очередь текущим потоком, но еще выполняемый, если Вы доступны, или если не доступный, задача, которая была разветвлена некоторым другим потоком при наличии.
|
void |
quietlyInvoke()
Начинает выполнение этой задачи и ждет ее завершения в случае необходимости, не возвращая ее результат или выдавая его исключение.
|
void |
quietlyJoin()
Соединения эта задача, не возвращая ее результат или выдавая ее исключение.
|
void |
reinitialize()
Сбрасывает внутреннее бухгалтерское состояние этой задачи, позволяя последующее
fork . |
protected abstract void |
setRawResult(V value)
Вынуждает данное значение быть возвращенным в результате.
|
boolean |
tryUnfork()
Попытки незапланировать эту задачу для выполнения.
|
public final ForkJoinTask<V> fork()
join()
или связанные методы, или звонок isDone()
возврат true
. Этот метод может быть вызван только изнутри ForkJoinPool
вычисления (как может быть определен, используя метод inForkJoinPool()
). Попытки вызвать в других контекстах приводят к исключениям или ошибкам, возможно включая ClassCastException
.
this
, упростить использованиеpublic final V join()
is done
. Этот метод отличается от get()
в том аварийном завершении приводит к RuntimeException
или Error
, нет ExecutionException
, и это прерывания вызывающего потока не заставляет метод резко возвращаться, бросая InterruptedException
.public final V invoke()
RuntimeException
или Error
если базовое вычисление сделало так.public static void invokeAll(ForkJoinTask<?> t1, ForkJoinTask<?> t2)
isDone
содержит для каждой задачи, или с исключением (непроверенным) встречаются, когда исключение повторно бросается. Если больше чем одна задача встречается с исключением, то этот метод выдает любое из этих исключений. Если какая-либо задача встречается с исключением, другой может быть отменен. Однако, состояние выполнения отдельных задач не гарантируется по исключительному возврату. Состояние каждой задачи может быть получено, используя getException()
и связанные методы, чтобы проверить, были ли они отменены, завершались обычно или исключительно, или оставляли необработанным. Этот метод может быть вызван только изнутри ForkJoinPool
вычисления (как может быть определен, используя метод inForkJoinPool()
). Попытки вызвать в других контекстах приводят к исключениям или ошибкам, возможно включая ClassCastException
.
t1
- первая задачаt2
- вторая задачаNullPointerException
- если какой-либо задачей является нульpublic static void invokeAll(ForkJoinTask<?>... tasks)
isDone
содержит для каждой задачи, или с исключением (непроверенным) встречаются, когда исключение повторно бросается. Если больше чем одна задача встречается с исключением, то этот метод выдает любое из этих исключений. Если какая-либо задача встречается с исключением, другие могут быть отменены. Однако, состояние выполнения отдельных задач не гарантируется по исключительному возврату. Состояние каждой задачи может быть получено, используя getException()
и связанные методы, чтобы проверить, были ли они отменены, завершались обычно или исключительно, или оставляли необработанным. Этот метод может быть вызван только изнутри ForkJoinPool
вычисления (как может быть определен, используя метод inForkJoinPool()
). Попытки вызвать в других контекстах приводят к исключениям или ошибкам, возможно включая ClassCastException
.
tasks
- задачиNullPointerException
- если какой-либо задачей является нульpublic static <T extends ForkJoinTask<?>> Collection<T> invokeAll(Collection<T> tasks)
isDone
содержит для каждой задачи, или с исключением (непроверенным) встречаются, когда исключение повторно бросается. Если больше чем одна задача встречается с исключением, то этот метод выдает любое из этих исключений. Если какая-либо задача встречается с исключением, другие могут быть отменены. Однако, состояние выполнения отдельных задач не гарантируется по исключительному возврату. Состояние каждой задачи может быть получено, используя getException()
и связанные методы, чтобы проверить, были ли они отменены, завершались обычно или исключительно, или оставляли необработанным. Этот метод может быть вызван только изнутри ForkJoinPool
вычисления (как может быть определен, используя метод inForkJoinPool()
). Попытки вызвать в других контекстах приводят к исключениям или ошибкам, возможно включая ClassCastException
.
tasks
- набор задачNullPointerException
- если задачами или каким-либо элементом является нульpublic boolean cancel(boolean mayInterruptIfRunning)
cancel
вызывается, выполнение этой задачи подавляется. После того, как этот метод возвращается успешно, если нет прошедший звонок reinitialize()
, последующие звонки isCancelled()
, isDone()
, и cancel
возвратится true
и звонки join()
и связанные методы приведут к CancellationException
. Этот метод может быть переопределен в подклассах, но если так, должен все еще гарантировать, что эти свойства содержат. В частности cancel
сам метод не должен выдать исключения.
Этот метод разрабатывается, чтобы быть вызванным другими задачами. Чтобы завершить текущую задачу, можно только возвратить или выдать исключение непроверенное от его метода вычисления, или вызвать completeExceptionally(java.lang.Throwable)
.
public final boolean isDone()
Future
public final boolean isCancelled()
Future
isCancelled
в интерфейсе Future<V>
public final boolean isCompletedAbnormally()
true
если эта задача выдавала исключение или была отменена.true
если эта задача выдавала исключение или была отмененаpublic final boolean isCompletedNormally()
true
если эта задача, завершенная, не выдавая исключение и, не была отменена.true
если эта задача, завершенная, не выдавая исключение и, не была отмененаpublic final Throwable getException()
CancellationException
если отменено, или null
если ни один или если метод еще не завершился.null
если ни одинpublic void completeExceptionally(Throwable ex)
join
и связанные операции. Этот метод может использоваться, чтобы вызвать исключения в асинхронных задачах, или вызвать завершение задач, которые иначе не завершились бы. Его использованию в других ситуациях обескураживают. Этот метод является переопределяемым, но переопределенные версии должны вызвать super
реализация, чтобы поддержать гарантии.ex
- исключение, чтобы бросить. Если это исключение не является a RuntimeException
или Error
, фактическое выданное исключение будет a RuntimeException
с причиной ex
.public void complete(V value)
join
и связанные операции. Этот метод может использоваться, чтобы обеспечить результаты для асинхронных задач, или обеспечить альтернативную обработку для задач, которые иначе обычно не завершались бы. Его использованию в других ситуациях обескураживают. Этот метод является переопределяемым, но переопределенные версии должны вызвать super
реализация, чтобы поддержать гарантии.value
- значение результата для этой задачиpublic final V get() throws InterruptedException, ExecutionException
get
в интерфейсе Future<V>
CancellationException
- если вычисление было отмененоExecutionException
- если вычисление выдавало исключениеInterruptedException
- если текущий поток не является элементом ForkJoinPool и был прерван, ожидаяpublic final V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
get
в интерфейсе Future<V>
timeout
- максимальное время, чтобы ожидатьunit
- единица измерения времени параметра тайм-аутаCancellationException
- если вычисление было отмененоExecutionException
- если вычисление выдавало исключениеInterruptedException
- если текущий поток не является элементом ForkJoinPool и был прерван, ожидаяTimeoutException
- если ожидание синхронизированногоpublic final void quietlyJoin()
public final void quietlyInvoke()
public static void helpQuiesce()
is quiescent
. Этот метод может быть полезным в проектах, в которых разветвляются много задач, но ни к одному явно не присоединяются, вместо этого выполняя их, пока все не обрабатываются. Этот метод может быть вызван только изнутри ForkJoinPool
вычисления (как может быть определен, используя метод inForkJoinPool()
). Попытки вызвать в других контекстах приводят к исключениям или ошибкам, возможно включая ClassCastException
.
public void reinitialize()
fork
. Этот метод позволяет повторенное повторное использование этой задачи, но только если повторное использование происходит, когда эта задача или никогда не разветвлялась, или была разветвлена, затем завершена, и все выдающиеся соединения этой задачи также завершились. Эффекты при любых других условиях использования не гарантируются. Этот метод может быть полезным когда выполнение предварительно созданные деревья подзадач в циклах. После завершения этого метода, isDone()
отчеты false
, и getException()
отчеты null
. Однако, значение, возвращенное getRawResult
незатронуто. Чтобы очистить это значение, можно вызвать setRawResult(null)
.
public static ForkJoinPool getPool()
null
если ни одинinForkJoinPool()
public static boolean inForkJoinPool()
true
если текущий поток является a ForkJoinWorkerThread
выполнение как вычисление ForkJoinPool.true
если текущий поток является a ForkJoinWorkerThread
выполнение как вычисление ForkJoinPool, или false
иначеpublic boolean tryUnfork()
Этот метод может быть вызван только изнутри ForkJoinPool
вычисления (как может быть определен, используя метод inForkJoinPool()
). Попытки вызвать в других контекстах приводят к исключениям или ошибкам, возможно включая ClassCastException
.
true
если неразветвленоpublic static int getQueuedTaskCount()
Этот метод может быть вызван только изнутри ForkJoinPool
вычисления (как может быть определен, используя метод inForkJoinPool()
). Попытки вызвать в других контекстах приводят к исключениям или ошибкам, возможно включая ClassCastException
.
public static int getSurplusQueuedTaskCount()
Этот метод может быть вызван только изнутри ForkJoinPool
вычисления (как может быть определен, используя метод inForkJoinPool()
). Попытки вызвать в других контекстах приводят к исключениям или ошибкам, возможно включая ClassCastException
.
public abstract V getRawResult()
join()
, даже если эта задача завершалась неправильно, или null
если эта задача, как известно, не была завершена. Этот метод разрабатывается, чтобы помочь отладке, так же как поддерживать расширения. Его использованию в любом другом контексте обескураживают.null
если не завершенныйprotected abstract void setRawResult(V value)
value
- значениеprotected abstract boolean exec()
complete(V)
стать joinable. Это может также выдать исключение (непроверенное), чтобы указать на аварийный выход.true
если завершено обычноprotected static ForkJoinTask<?> peekNextLocalTask()
Этот метод может быть вызван только изнутри ForkJoinPool
вычисления (как может быть определен, используя метод inForkJoinPool()
). Попытки вызвать в других контекстах приводят к исключениям или ошибкам, возможно включая ClassCastException
.
null
если ни один не доступенprotected static ForkJoinTask<?> pollNextLocalTask()
Этот метод может быть вызван только изнутри ForkJoinPool
вычисления (как может быть определен, используя метод inForkJoinPool()
). Попытки вызвать в других контекстах приводят к исключениям или ошибкам, возможно включая ClassCastException
.
null
если ни один не доступенprotected static ForkJoinTask<?> pollTask()
null
результат не обязательно подразумевает неподвижность пула, в котором работает эта задача. Этот метод разрабатывается прежде всего, чтобы поддерживать расширения, и вряд ли будет полезен иначе. Этот метод может быть вызван только изнутри ForkJoinPool
вычисления (как может быть определен, используя метод inForkJoinPool()
). Попытки вызвать в других контекстах приводят к исключениям или ошибкам, возможно включая ClassCastException
.
null
если ни один не доступенpublic static ForkJoinTask<?> adapt(Runnable runnable)
ForkJoinTask
это выполняет run
метод данного Runnable
как его действие, и возвраты нулевой результат на join()
.runnable
- выполнимое действиеpublic static <T> ForkJoinTask<T> adapt(Runnable runnable, T result)
ForkJoinTask
это выполняет run
метод данного Runnable
как его действие, и возвраты данный результат на join()
.runnable
- выполнимое действиеresult
- результат после завершенияpublic static <T> ForkJoinTask<T> adapt(Callable<? extends T> callable)
ForkJoinTask
это выполняет call
метод данного Callable
как его действие, и возвраты его результат на join()
, преобразование любых проверенных исключений, в которые встречаются RuntimeException
.callable
- вызываемое действие
Для дальнейшей ссылки API и документации разработчика, см.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.