Most visited

Recently visited

Added in API level 21

ForkJoinPool

public class ForkJoinPool
extends AbstractExecutorService

java.lang.Object
   ↳ java.util.concurrent.AbstractExecutorService
     ↳ java.util.concurrent.ForkJoinPool


一个ExecutorService运行ForkJoinTask秒。 ForkJoinPool为来自非ForkJoinTask客户的提交以及管理和监控操作提供了切入点。

一个ForkJoinPool与其他种类的不同ExecutorService主要凭借用人偷盗的:所有的线程池中试图找到并执行其他活动任务提交到池和/或创建(最终阻塞等待工作,如果不存在)的任务。 这可以在大多数任务产生其他子任务时(如大多数ForkJoinTask )以及从外部客户端将许多小任务提交给池时的高效处理。 尤其是在构造函数设置asyncMode为真时, ForkJoinPool S还可能适合于与事件式的任务中使用那些从未加入。

静态commonPool()适用于大多数应用程序。 公共池由任何未明确提交到指定池的ForkJoinTask使用。 使用公共池通常可以减少资源使用(其线程在非使用期间缓慢回收,并在随后使用时恢复)。

对于需要单独或自定义池的应用程序, ForkJoinPool可以用给定的目标并行性级别构建; 默认情况下,等于可用处理器的数量。 池通过动态添加,挂起或恢复内部工作线程来尝试维护足够的活动线程(或可用线程),即使某些任务停止等待加入其他任务。 但是,面对阻塞的I / O或其他非托管同步,无法保证这种调整。 嵌套的ForkJoinPool.ManagedBlocker接口可以扩展适应的种类。

除了执行和生命周期控制方法外,此类还提供旨在帮助开发,调整和监视分支/加入应用程序的状态检查方法(例如getStealCount() )。 此外,方法toString()以便利的形式返回池状态的指示以用于非正式监视。

与其他ExecutorServices一样,下表中总结了三种主要的任务执行方法。 这些设计主要由尚未在当前池中进行fork / join计算的客户端使用。 这些方法的主要形式接受ForkJoinTask实例,但重载的表单也允许混合执行基于RunnableCallable的活动。 但是,除非使用通常不会加入的异步事件样式任务,否则,已在池中执行的任务通常应该使用表中列出的内部计算表单,在这种情况下,方法选择之间几乎没有区别。

Summary of task execution methods
Call from non-fork/join clients Call from within fork/join computations
Arrange async execution execute(ForkJoinTask) fork()
Await and obtain result invoke(ForkJoinTask) invoke()
Arrange exec and obtain Future submit(ForkJoinTask) fork() (ForkJoinTasks are Futures)

公共池默认使用默认参数构建,但这些可以通过设置三个 system properties来控制:

If a SecurityManager is present and no factory is specified, then the default pool uses a factory supplying threads that have no Permissions enabled. The system class loader is used to load these classes. Upon any error in establishing these settings, default parameters are used. It is possible to disable or limit the use of threads in the common pool by setting the parallelism property to zero, and/or using a factory that may return null. However doing so may cause unjoined tasks to never be executed.

实现注意事项 :此实现将正在运行的线程的最大数量限制为32767.尝试创建大于 IllegalArgumentException的最大数目的 IllegalArgumentException

只有在池关闭或内部资源耗尽时,此实现才会拒绝提交的任务(即通过抛出 RejectedExecutionException )。

Summary

Nested classes

interface ForkJoinPool.ForkJoinWorkerThreadFactory

用于创建新的ForkJoinWorkerThread s的工厂。

interface ForkJoinPool.ManagedBlocker

用于扩展在ForkJoinPool运行的任务的管理并行性的接口。

Fields

public static final ForkJoinPool.ForkJoinWorkerThreadFactory defaultForkJoinWorkerThreadFactory

创建一个新的ForkJoinWorkerThread。

Public constructors

ForkJoinPool()

创建一个 ForkJoinPool ,并行度等于 availableProcessors() ,使用 default thread factory ,无UncaughtExceptionHandler和非异步LIFO处理模式。

ForkJoinPool(int parallelism)

创建 ForkJoinPool用指示的并行层面, default thread factory ,没有UncaughtExceptionHandler的,和非异步LIFO处理模式。

ForkJoinPool(int parallelism, ForkJoinPool.ForkJoinWorkerThreadFactory factory, Thread.UncaughtExceptionHandler handler, boolean asyncMode)

用给定的参数创建一个 ForkJoinPool

Public methods

boolean awaitQuiescence(long timeout, TimeUnit unit)

如果由在该池中运行的ForkJoinTask调用,则等效于 helpQuiesce()

boolean awaitTermination(long timeout, TimeUnit unit)

阻塞,直到所有任务在关闭请求之后所有任务都已完成执行,或发生超时,或当前线程中断,以先发生者为准。

static ForkJoinPool commonPool()

返回公共池实例。

void execute(Runnable task)
void execute(ForkJoinTask<?> task)

安排(异步)执行给定的任务。

int getActiveThreadCount()

返回当前正在窃取或执行任务的线程数的估计值。

boolean getAsyncMode()

如果此池使用本地先进先出调度模式执行未加入的分支任务,则返回 true

static int getCommonPoolParallelism()

返回公共池的目标并行度级别。

ForkJoinPool.ForkJoinWorkerThreadFactory getFactory()

返回用于构建新工人的工厂。

int getParallelism()

返回此池的目标并行度级别。

int getPoolSize()

返回已开始但尚未终止的工作线程数。

int getQueuedSubmissionCount()

返回提交给该池但尚未开始执行的任务数量的估计值。

long getQueuedTaskCount()

返回工作线程当前在队列中保留的任务总数的估计值(但不包括提交给池的任务尚未开始执行的任务)。

int getRunningThreadCount()

返回未阻止等待加入任务或其他受管同步的工作线程数量的估计值。

long getStealCount()

返回另一个线程工作队列中被盗任务总数的估计值。

Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()

返回由于执行任务时遇到的不可恢复的错误而终止的内部工作线程的处理程序。

boolean hasQueuedSubmissions()

如果有任何任务提交给该池尚未开始执行,则返回 true

<T> T invoke(ForkJoinTask<T> task)

执行给定的任务,完成后返回结果。

<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)

执行给定的任务,返回一份持有其状态和结果的期货清单,当全部完成时。

boolean isQuiescent()

如果所有工作线程当前空闲,则返回 true

boolean isShutdown()

如果此池已关闭,则返回 true

boolean isTerminated()

如果所有任务都在关闭后完成,则返回 true

boolean isTerminating()

如果终止过程已经开始但尚未完成,则返回 true

static void managedBlock(ForkJoinPool.ManagedBlocker blocker)

运行给定的可能阻塞的任务。

void shutdown()

可能会启动有序关闭,其中先前提交的任务将执行,但不会接受任何新任务。

List<Runnable> shutdownNow()

可能尝试取消和/或停止所有任务,并拒绝所有随后提交的任务。

<T> ForkJoinTask<T> submit(Callable<T> task)

提交执行的返回值任务,并返回表示未完成任务结果的Future。

<T> ForkJoinTask<T> submit(ForkJoinTask<T> task)

提交ForkJoinTask执行。

ForkJoinTask<?> submit(Runnable task)

提交可执行的任务并返回表示该任务的Future。

<T> ForkJoinTask<T> submit(Runnable task, T result)

提交可执行的任务并返回表示该任务的Future。

String toString()

返回标识此池的字符串及其状态,包括运行状态,并行级别以及工作和任务计数的指示。

Protected methods

int drainTasksTo(Collection<? super ForkJoinTask<?>> c)

从调度队列中删除所有未执行的提交和分派任务,并将它们添加到给定集合中,而不更改其执行状态。

<T> RunnableFuture<T> newTaskFor(Runnable runnable, T value)

针对给定的可运行和默认值返回 RunnableFuture

<T> RunnableFuture<T> newTaskFor(Callable<T> callable)

为给定的可调用任务返回 RunnableFuture

ForkJoinTask<?> pollSubmission()

删除并返回下一个未执行的提交(如果有)。

Inherited methods

From class java.util.concurrent.AbstractExecutorService
From class java.lang.Object
From interface java.util.concurrent.ExecutorService
From interface java.util.concurrent.Executor

Fields

defaultForkJoinWorkerThreadFactory

Added in API level 21
ForkJoinPool.ForkJoinWorkerThreadFactory defaultForkJoinWorkerThreadFactory

创建一个新的ForkJoinWorkerThread。 除非在ForkJoinPool构造函数中重写,否则将使用此工厂。

Public constructors

ForkJoinPool

Added in API level 21
ForkJoinPool ()

创建 ForkJoinPool ,并行度等于 availableProcessors() ,使用 default thread factory ,no UncaughtExceptionHandler和非异步LIFO处理模式。

Throws
SecurityException if a security manager exists and the caller is not permitted to modify threads because it does not hold RuntimePermission("modifyThread")

ForkJoinPool

Added in API level 21
ForkJoinPool (int parallelism)

创建 ForkJoinPool用指示的并行层面, default thread factory ,没有UncaughtExceptionHandler的,和非异步LIFO处理模式。

Parameters
parallelism int: the parallelism level
Throws
IllegalArgumentException if parallelism less than or equal to zero, or greater than implementation limit
SecurityException if a security manager exists and the caller is not permitted to modify threads because it does not hold RuntimePermission("modifyThread")

ForkJoinPool

Added in API level 21
ForkJoinPool (int parallelism, 
                ForkJoinPool.ForkJoinWorkerThreadFactory factory, 
                Thread.UncaughtExceptionHandler handler, 
                boolean asyncMode)

用给定的参数创建一个 ForkJoinPool

Parameters
parallelism int: the parallelism level. For default value, use availableProcessors().
factory ForkJoinPool.ForkJoinWorkerThreadFactory: the factory for creating new threads. For default value, use defaultForkJoinWorkerThreadFactory.
handler Thread.UncaughtExceptionHandler: the handler for internal worker threads that terminate due to unrecoverable errors encountered while executing tasks. For default value, use null.
asyncMode boolean: if true, establishes local first-in-first-out scheduling mode for forked tasks that are never joined. This mode may be more appropriate than default locally stack-based mode in applications in which worker threads only process event-style asynchronous tasks. For default value, use false.
Throws
IllegalArgumentException if parallelism less than or equal to zero, or greater than implementation limit
NullPointerException if the factory is null
SecurityException if a security manager exists and the caller is not permitted to modify threads because it does not hold RuntimePermission("modifyThread")

Public methods

awaitQuiescence

Added in API level 21
boolean awaitQuiescence (long timeout, 
                TimeUnit unit)

如果由在该池中运行的ForkJoinTask调用,则等效于helpQuiesce() 否则,等待和/或尝试协助执行任务,直到该池isQuiescent()或指示的超时过去。

Parameters
timeout long: the maximum time to wait
unit TimeUnit: the time unit of the timeout argument
Returns
boolean true if quiescent; false if the timeout elapsed.

awaitTermination

Added in API level 21
boolean awaitTermination (long timeout, 
                TimeUnit unit)

阻塞,直到所有任务在关闭请求之后所有任务都已完成执行,或发生超时,或当前线程中断,以先发生者为准。 由于commonPool()在程序关闭之前永不终止,因此应用于公共池时,此方法等同于awaitQuiescence(long, TimeUnit)但始终返回false

Parameters
timeout long: the maximum time to wait
unit TimeUnit: the time unit of the timeout argument
Returns
boolean true if this executor terminated and false if the timeout elapsed before termination
Throws
InterruptedException if interrupted while waiting

commonPool

Added in API level 24
ForkJoinPool commonPool ()

返回公共池实例。 这个池是静态构建的; 其运行状态不受shutdown()shutdownNow()尝试影响。 然而,该池和任何正在进行的处理在程序exit(int)自动终止。 任何依赖异步任务处理在程序终止前完成的程序都应该在退出之前调用commonPool(). awaitQuiescence

Returns
ForkJoinPool the common pool instance

execute

Added in API level 21
void execute (Runnable task)

Parameters
task Runnable
Throws
NullPointerException if the task is null
RejectedExecutionException if the task cannot be scheduled for execution

execute

Added in API level 21
void execute (ForkJoinTask<?> task)

安排(异步)执行给定的任务。

Parameters
task ForkJoinTask: the task
Throws
NullPointerException if the task is null
RejectedExecutionException if the task cannot be scheduled for execution

getActiveThreadCount

Added in API level 21
int getActiveThreadCount ()

返回当前正在窃取或执行任务的线程数的估计值。 此方法可能会高估活动线程的数量。

Returns
int the number of active threads

getAsyncMode

Added in API level 21
boolean getAsyncMode ()

如果此池使用本地先进先出调度模式执行未加入的分支任务,则返回 true

Returns
boolean true if this pool uses async mode

getCommonPoolParallelism

Added in API level 24
int getCommonPoolParallelism ()

返回公共池的目标并行度级别。

Returns
int the targeted parallelism level of the common pool

getFactory

Added in API level 21
ForkJoinPool.ForkJoinWorkerThreadFactory getFactory ()

返回用于构建新工人的工厂。

Returns
ForkJoinPool.ForkJoinWorkerThreadFactory the factory used for constructing new workers

getParallelism

Added in API level 21
int getParallelism ()

返回此池的目标并行度级别。

Returns
int the targeted parallelism level of this pool

getPoolSize

Added in API level 21
int getPoolSize ()

返回已开始但尚未终止的工作线程数。 当创建线程时,此方法返回的结果可能与getParallelism()不同, getParallelism()在其他人协作阻止时保持并行性。

Returns
int the number of worker threads

getQueuedSubmissionCount

Added in API level 21
int getQueuedSubmissionCount ()

返回提交给该池但尚未开始执行的任务数量的估计值。 此方法可能需要与提交次数成比例的时间。

Returns
int the number of queued submissions

getQueuedTaskCount

Added in API level 21
long getQueuedTaskCount ()

返回工作线程当前在队列中保留的任务总数的估计值(但不包括提交给池的任务尚未开始执行的任务)。 该值只是一个近似值,通过遍历池中的所有线程获得。 此方法可能对调整任务粒度很有用。

Returns
long the number of queued tasks

getRunningThreadCount

Added in API level 21
int getRunningThreadCount ()

返回未阻止等待加入任务或其他受管同步的工作线程数量的估计值。 此方法可能会高估运行线程的数量。

Returns
int the number of worker threads

getStealCount

Added in API level 21
long getStealCount ()

返回另一个线程工作队列中被盗任务总数的估计值。 当游泳池不静止时,报告的值低估了实际的总抢断次数。 该值对于监视和调整fork / join程序非常有用:通常,窃取计数应足够高以保持线程繁忙,但又足够低以避免跨线程的开销和争用。

Returns
long the number of steals

getUncaughtExceptionHandler

Added in API level 21
Thread.UncaughtExceptionHandler getUncaughtExceptionHandler ()

返回由于执行任务时遇到的不可恢复的错误而终止的内部工作线程的处理程序。

Returns
Thread.UncaughtExceptionHandler the handler, or null if none

hasQueuedSubmissions

Added in API level 21
boolean hasQueuedSubmissions ()

返回 true如果有任何任务提交给该池尚未开始执行。

Returns
boolean true if there are any queued submissions

invoke

Added in API level 21
T invoke (ForkJoinTask<T> task)

执行给定的任务,完成后返回结果。 如果计算遇到未检查的异常或错误,则将其作为此调用的结果重新生成。 突发异常的行为与常规异常相同,但在可能的情况下,包含当前线程以及实际遇到异常的线程的堆栈跟踪(例如,使用ex.printStackTrace()显示); 最低限度只有后者。

Parameters
task ForkJoinTask: the task
Returns
T the task's result
Throws
NullPointerException if the task is null
RejectedExecutionException if the task cannot be scheduled for execution

invokeAll

Added in API level 21
List<Future<T>> invokeAll (Collection<? extends Callable<T>> tasks)

执行给定的任务,返回一份持有其状态和结果的期货清单,当全部完成时。 isDone()对于返回列表的每个元素都是true 请注意, 完成的任务可能正常结束或通过抛出异常终止。 如果在进行此操作时修改了给定集合,则此方法的结果未定义。

Parameters
tasks Collection: the collection of tasks
Returns
List<Future<T>> a list of Futures representing the tasks, in the same sequential order as produced by the iterator for the given task list, each of which has completed
Throws
NullPointerException
RejectedExecutionException

isQuiescent

Added in API level 21
boolean isQuiescent ()

如果所有工作线程当前空闲,则返回true 闲置的工作者是无法获得任务来执行的工作者,因为没有人可以从其他线程窃取,并且没有待处理的提交到池中。 这种方法是保守的; 它可能不会在所有线程空闲时立即返回true ,但如果线程保持不活动状态,则最终会变为真。

Returns
boolean true if all threads are currently idle

isShutdown

Added in API level 21
boolean isShutdown ()

如果此池已关闭,则返回 true

Returns
boolean true if this pool has been shut down

isTerminated

Added in API level 21
boolean isTerminated ()

如果所有任务都在关闭后完成,则返回 true

Returns
boolean true if all tasks have completed following shut down

isTerminating

Added in API level 21
boolean isTerminating ()

如果终止过程已经开始但尚未完成,则返回true 该方法可能对调试有用。 true报告的关闭时间足够长,可能表示提交的任务已忽略或抑制中断,或正在等待I / O,导致此执行程序未正确终止。 (请参阅ForkJoinTask类的ForkJoinTask说明,指出任务通常不应导致阻塞操作,但如果它们这样做,则必须在中断时中止它们。)

Returns
boolean true if terminating but not yet terminated

managedBlock

Added in API level 21
void managedBlock (ForkJoinPool.ManagedBlocker blocker)

运行给定的可能阻塞的任务。 running in a ForkJoinPool时 ,此方法可能会安排备用线程在必要时被激活,以确保足够的并行性,而当前线程在blocker.block()被阻止。

此方法重复调用blocker.isReleasable()blocker.block()直到任一方法返回true 对每一个呼叫blocker.block()由一个呼叫之前blocker.isReleasable()一个返回false

如果不在ForkJoinPool中运行,则此方法在行为上等同于

 while (!blocker.isReleasable())
   if (blocker.block())
     break;
If running in a ForkJoinPool, the pool may first be expanded to ensure sufficient parallelism available during the call to blocker.block().

Parameters
blocker ForkJoinPool.ManagedBlocker: the blocker task
Throws
InterruptedException if blocker.block() did so

shutdown

Added in API level 21
void shutdown ()

可能会启动有序关闭,其中先前提交的任务将执行,但不会接受任何新任务。 如果这是commonPool() ,则调用对执行状态没有影响,如果已经关闭,则不会有其他影响。 在此方法过程中同时提交的任务可能会或可能不会被拒绝。

Throws
SecurityException if a security manager exists and the caller is not permitted to modify threads because it does not hold RuntimePermission("modifyThread")

shutdownNow

Added in API level 21
List<Runnable> shutdownNow ()

可能尝试取消和/或停止所有任务,并拒绝所有随后提交的任务。 如果这是commonPool() ,则调用对执行状态没有影响,如果已经关闭,则不会有其他影响。 否则,在此方法过程中同时提交或执行的任务可能会或可能不会被拒绝。 此方法取消现有和未执行的任务,以允许在存在任务依赖关系时终止。 所以该方法总是返回一个空列表(与其他一些Executors不同)。

Returns
List<Runnable> an empty list
Throws
SecurityException if a security manager exists and the caller is not permitted to modify threads because it does not hold RuntimePermission("modifyThread")

submit

Added in API level 21
ForkJoinTask<T> submit (Callable<T> task)

提交执行的返回值任务,并返回表示未完成任务结果的Future。 未来的get方法将在成功完成后返回任务的结果。

如果您想立即阻止等待任务,可以使用表单 result = exec.submit(aCallable).get();

注意: Executors类包含一组方法,可以将一些其他常见闭合对象(例如, PrivilegedActionCallable表单,以便它们可以提交。

Parameters
task Callable: the task to submit
Returns
ForkJoinTask<T> a Future representing pending completion of the task
Throws
NullPointerException if the task is null
RejectedExecutionException if the task cannot be scheduled for execution

submit

Added in API level 21
ForkJoinTask<T> submit (ForkJoinTask<T> task)

提交ForkJoinTask执行。

Parameters
task ForkJoinTask: the task to submit
Returns
ForkJoinTask<T> the task
Throws
NullPointerException if the task is null
RejectedExecutionException if the task cannot be scheduled for execution

submit

Added in API level 21
ForkJoinTask<?> submit (Runnable task)

提交可执行的任务并返回表示该任务的Future。 成功完成后,未来get方法将返回null

Parameters
task Runnable: the task to submit
Returns
ForkJoinTask<?> a Future representing pending completion of the task
Throws
NullPointerException if the task is null
RejectedExecutionException if the task cannot be scheduled for execution

submit

Added in API level 21
ForkJoinTask<T> submit (Runnable task, 
                T result)

提交可执行的任务并返回表示该任务的Future。 未来的get方法将在成功完成后返回给定的结果。

Parameters
task Runnable: the task to submit
result T: the result to return
Returns
ForkJoinTask<T> a Future representing pending completion of the task
Throws
NullPointerException if the task is null
RejectedExecutionException if the task cannot be scheduled for execution

toString

Added in API level 21
String toString ()

返回标识此池的字符串及其状态,包括运行状态,并行级别以及工作和任务计数的指示。

Returns
String a string identifying this pool, as well as its state

Protected methods

drainTasksTo

Added in API level 21
int drainTasksTo (Collection<? super ForkJoinTask<?>> c)

从调度队列中删除所有未执行的提交和分派任务,并将它们添加到给定集合中,而不更改其执行状态。 这些可能包括人工生成或包装的任务。 此方法旨在仅在池已知为静态时才被调用。 其他时间的调用可能不会删除所有任务。 尝试将元素添加到集合c遇到的故障可能导致元素不在任何集合中,或者在引发关联的异常时集合中的任何一个或两个集合。 如果在操作过程中修改了指定的集合,则此操作的行为未定义。

Parameters
c Collection: the collection to transfer elements into
Returns
int the number of elements transferred

newTaskFor

Added in API level 21
RunnableFuture<T> newTaskFor (Runnable runnable, 
                T value)

针对给定的可运行和默认值返回 RunnableFuture

Parameters
runnable Runnable: the runnable task being wrapped
value T: the default value for the returned future
Returns
RunnableFuture<T> a RunnableFuture which, when run, will run the underlying runnable and which, as a Future, will yield the given value as its result and provide for cancellation of the underlying task

newTaskFor

Added in API level 21
RunnableFuture<T> newTaskFor (Callable<T> callable)

为给定的可调用任务返回 RunnableFuture

Parameters
callable Callable: the callable task being wrapped
Returns
RunnableFuture<T> a RunnableFuture which, when run, will call the underlying callable and which, as a Future, will yield the callable's result as its result and provide for cancellation of the underlying task

pollSubmission

Added in API level 21
ForkJoinTask<?> pollSubmission ()

删除并返回下一个未执行的提交(如果有)。 此方法可能对此类的扩展有用,该类会在具有多个池的系统中重新分配工作。

Returns
ForkJoinTask<?> the next submission, or null if none

Hooray!