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
实例,但重载的表单也允许混合执行基于Runnable
或Callable
的活动。 但是,除非使用通常不会加入的异步事件样式任务,否则,已在池中执行的任务通常应该使用表中列出的内部计算表单,在这种情况下,方法选择之间几乎没有区别。
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来控制:
java.util.concurrent.ForkJoinPool.common.parallelism
- the parallelism level, a non-negative integer java.util.concurrent.ForkJoinPool.common.threadFactory
- the class name of a ForkJoinPool.ForkJoinWorkerThreadFactory
java.util.concurrent.ForkJoinPool.common.exceptionHandler
- the class name of a Thread.UncaughtExceptionHandler
java.util.concurrent.ForkJoinPool.common.maximumSpares
- the maximum number of allowed extra threads to maintain target parallelism (default 256). 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
)。
Nested classes |
|
---|---|
interface |
ForkJoinPool.ForkJoinWorkerThreadFactory 用于创建新的 |
interface |
ForkJoinPool.ManagedBlocker 用于扩展在 |
Fields |
|
---|---|
public static final ForkJoinPool.ForkJoinWorkerThreadFactory |
defaultForkJoinWorkerThreadFactory 创建一个新的ForkJoinWorkerThread。 |
Public constructors |
|
---|---|
ForkJoinPool() 创建一个 |
|
ForkJoinPool(int parallelism) 创建 |
|
ForkJoinPool(int parallelism, ForkJoinPool.ForkJoinWorkerThreadFactory factory, Thread.UncaughtExceptionHandler handler, boolean asyncMode) 用给定的参数创建一个 |
Public methods |
|
---|---|
boolean |
awaitQuiescence(long timeout, TimeUnit unit) 如果由在该池中运行的ForkJoinTask调用,则等效于 |
boolean |
awaitTermination(long timeout, TimeUnit unit) 阻塞,直到所有任务在关闭请求之后所有任务都已完成执行,或发生超时,或当前线程中断,以先发生者为准。 |
static ForkJoinPool |
commonPool() 返回公共池实例。 |
void |
execute(Runnable task) |
void |
execute(ForkJoinTask<?> task) 安排(异步)执行给定的任务。 |
int |
getActiveThreadCount() 返回当前正在窃取或执行任务的线程数的估计值。 |
boolean |
getAsyncMode() 如果此池使用本地先进先出调度模式执行未加入的分支任务,则返回 |
static int |
getCommonPoolParallelism() 返回公共池的目标并行度级别。 |
ForkJoinPool.ForkJoinWorkerThreadFactory |
getFactory() 返回用于构建新工人的工厂。 |
int |
getParallelism() 返回此池的目标并行度级别。 |
int |
getPoolSize() 返回已开始但尚未终止的工作线程数。 |
int |
getQueuedSubmissionCount() 返回提交给该池但尚未开始执行的任务数量的估计值。 |
long |
getQueuedTaskCount() 返回工作线程当前在队列中保留的任务总数的估计值(但不包括提交给池的任务尚未开始执行的任务)。 |
int |
getRunningThreadCount() 返回未阻止等待加入任务或其他受管同步的工作线程数量的估计值。 |
long |
getStealCount() 返回另一个线程工作队列中被盗任务总数的估计值。 |
Thread.UncaughtExceptionHandler |
getUncaughtExceptionHandler() 返回由于执行任务时遇到的不可恢复的错误而终止的内部工作线程的处理程序。 |
boolean |
hasQueuedSubmissions() 如果有任何任务提交给该池尚未开始执行,则返回 |
<T> T |
invoke(ForkJoinTask<T> task) 执行给定的任务,完成后返回结果。 |
<T> List<Future<T>> |
invokeAll(Collection<? extends Callable<T>> tasks) 执行给定的任务,返回一份持有其状态和结果的期货清单,当全部完成时。 |
boolean |
isQuiescent() 如果所有工作线程当前空闲,则返回 |
boolean |
isShutdown() 如果此池已关闭,则返回 |
boolean |
isTerminated() 如果所有任务都在关闭后完成,则返回 |
boolean |
isTerminating() 如果终止过程已经开始但尚未完成,则返回 |
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) 针对给定的可运行和默认值返回 |
<T> RunnableFuture<T> |
newTaskFor(Callable<T> callable) 为给定的可调用任务返回 |
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
|
ForkJoinPool.ForkJoinWorkerThreadFactory defaultForkJoinWorkerThreadFactory
创建一个新的ForkJoinWorkerThread。 除非在ForkJoinPool构造函数中重写,否则将使用此工厂。
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 (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 (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") |
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. |
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 |
ForkJoinPool commonPool ()
返回公共池实例。 这个池是静态构建的; 其运行状态不受shutdown()
或shutdownNow()
尝试影响。 然而,该池和任何正在进行的处理在程序exit(int)
自动终止。 任何依赖异步任务处理在程序终止前完成的程序都应该在退出之前调用commonPool().
awaitQuiescence
。
Returns | |
---|---|
ForkJoinPool |
the common pool instance |
void execute (Runnable task)
Parameters | |
---|---|
task |
Runnable
|
Throws | |
---|---|
NullPointerException |
if the task is null |
RejectedExecutionException |
if the task cannot be scheduled for execution |
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 |
int getActiveThreadCount ()
返回当前正在窃取或执行任务的线程数的估计值。 此方法可能会高估活动线程的数量。
Returns | |
---|---|
int |
the number of active threads |
boolean getAsyncMode ()
如果此池使用本地先进先出调度模式执行未加入的分支任务,则返回 true
。
Returns | |
---|---|
boolean |
true if this pool uses async mode |
int getCommonPoolParallelism ()
返回公共池的目标并行度级别。
Returns | |
---|---|
int |
the targeted parallelism level of the common pool |
ForkJoinPool.ForkJoinWorkerThreadFactory getFactory ()
返回用于构建新工人的工厂。
Returns | |
---|---|
ForkJoinPool.ForkJoinWorkerThreadFactory |
the factory used for constructing new workers |
int getParallelism ()
返回此池的目标并行度级别。
Returns | |
---|---|
int |
the targeted parallelism level of this pool |
int getPoolSize ()
返回已开始但尚未终止的工作线程数。 当创建线程时,此方法返回的结果可能与getParallelism()
不同, getParallelism()
在其他人协作阻止时保持并行性。
Returns | |
---|---|
int |
the number of worker threads |
int getQueuedSubmissionCount ()
返回提交给该池但尚未开始执行的任务数量的估计值。 此方法可能需要与提交次数成比例的时间。
Returns | |
---|---|
int |
the number of queued submissions |
long getQueuedTaskCount ()
返回工作线程当前在队列中保留的任务总数的估计值(但不包括提交给池的任务尚未开始执行的任务)。 该值只是一个近似值,通过遍历池中的所有线程获得。 此方法可能对调整任务粒度很有用。
Returns | |
---|---|
long |
the number of queued tasks |
int getRunningThreadCount ()
返回未阻止等待加入任务或其他受管同步的工作线程数量的估计值。 此方法可能会高估运行线程的数量。
Returns | |
---|---|
int |
the number of worker threads |
long getStealCount ()
返回另一个线程工作队列中被盗任务总数的估计值。 当游泳池不静止时,报告的值低估了实际的总抢断次数。 该值对于监视和调整fork / join程序非常有用:通常,窃取计数应足够高以保持线程繁忙,但又足够低以避免跨线程的开销和争用。
Returns | |
---|---|
long |
the number of steals |
Thread.UncaughtExceptionHandler getUncaughtExceptionHandler ()
返回由于执行任务时遇到的不可恢复的错误而终止的内部工作线程的处理程序。
Returns | |
---|---|
Thread.UncaughtExceptionHandler |
the handler, or null if none |
boolean hasQueuedSubmissions ()
返回 true
如果有任何任务提交给该池尚未开始执行。
Returns | |
---|---|
boolean |
true if there are any queued submissions |
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 |
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 |
boolean isQuiescent ()
如果所有工作线程当前空闲,则返回true
。 闲置的工作者是无法获得任务来执行的工作者,因为没有人可以从其他线程窃取,并且没有待处理的提交到池中。 这种方法是保守的; 它可能不会在所有线程空闲时立即返回true
,但如果线程保持不活动状态,则最终会变为真。
Returns | |
---|---|
boolean |
true if all threads are currently idle |
boolean isShutdown ()
如果此池已关闭,则返回 true
。
Returns | |
---|---|
boolean |
true if this pool has been shut down |
boolean isTerminated ()
如果所有任务都在关闭后完成,则返回 true
。
Returns | |
---|---|
boolean |
true if all tasks have completed following shut down |
boolean isTerminating ()
如果终止过程已经开始但尚未完成,则返回true
。 该方法可能对调试有用。 true
报告的关闭时间足够长,可能表示提交的任务已忽略或抑制中断,或正在等待I / O,导致此执行程序未正确终止。 (请参阅ForkJoinTask
类的ForkJoinTask
说明,指出任务通常不应导致阻塞操作,但如果它们这样做,则必须在中断时中止它们。)
Returns | |
---|---|
boolean |
true if terminating but not yet terminated |
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 |
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") |
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") |
ForkJoinTask<T> submit (Callable<T> task)
提交执行的返回值任务,并返回表示未完成任务结果的Future。 未来的get
方法将在成功完成后返回任务的结果。
如果您想立即阻止等待任务,可以使用表单 result = exec.submit(aCallable).get();
注意: Executors
类包含一组方法,可以将一些其他常见闭合对象(例如, PrivilegedAction
为 Callable
表单,以便它们可以提交。
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 |
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 |
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 |
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 |
String toString ()
返回标识此池的字符串及其状态,包括运行状态,并行级别以及工作和任务计数的指示。
Returns | |
---|---|
String |
a string identifying this pool, as well as its state |
int drainTasksTo (Collection<? super ForkJoinTask<?>> c)
从调度队列中删除所有未执行的提交和分派任务,并将它们添加到给定集合中,而不更改其执行状态。 这些可能包括人工生成或包装的任务。 此方法旨在仅在池已知为静态时才被调用。 其他时间的调用可能不会删除所有任务。 尝试将元素添加到集合c
遇到的故障可能导致元素不在任何集合中,或者在引发关联的异常时集合中的任何一个或两个集合。 如果在操作过程中修改了指定的集合,则此操作的行为未定义。
Parameters | |
---|---|
c |
Collection : the collection to transfer elements into |
Returns | |
---|---|
int |
the number of elements transferred |
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 |
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 |
ForkJoinTask<?> pollSubmission ()
删除并返回下一个未执行的提交(如果有)。 此方法可能对此类的扩展有用,该类会在具有多个池的系统中重新分配工作。
Returns | |
---|---|
ForkJoinTask<?> |
the next submission, or null if none |