ForkJoinPool 类
ForkJoinPool 类是 Fork/Join 框架的核心,也是 Fork/Join 框架执行的入口点,它实现了接口 ExecutorService。ForkJoinPool 类的任务是负责管理线程,并提供线程执行状态和任务处理的相关信息。
ForkJoinPool 的创建
ForkJoinPool 类从 AbstractExecutorService 类继承,主要用于处理 ForkJoinTask 中的任务。
ForkJoinPool 类构造方法有三种形式:
1、ForkJoinPool() : 创建一个线程池,线程池中的线程数目根据CPU的核数设定。
2、ForkJoinPool(int parallelism) :用户指定线程池中线程的数目。
3、public ForkJoinPool(int parallelism, ForkJoinWorkerThreadFactory factory,UncaughtExceptionHandler handler, boolean asyncMode) :指明线程工厂、异常处理的handler 和 工作模式。
ForkJoinPool 的使用
ForkJoinPool 的使用大致可以分为两种:
- 通过invoke、execute 和 submit 执行任务。
- 在程序执行过程中通过 fork 操作执行的任务。
ForkJoinPool 常用的方法
- invoke(ForkJoinTask task) :是一个同步调用方法;处理给定任务并返回结果,返回结果的类型由 T 指定。
- invokeAll(Collection<? extendsCallable> tasks) : 是一个同步调用方法;执行给定的任务列表,返回持有任务状态和任务完成时的结果的Future列表。
- execute(ForkJoinTask<?> task) : 安排(异步)执行给定的任务,一般没有返回结果。
- execute(Runnable task) : 把一个 Runnable 线程所代表的任务送到 ForkJoinPool 中;ForkJoinPool 不会对 Runnable(Callable) 对象使用工作窃取算法,该算法只会被应用到 ForkJoinTask 对象中。
- submit(Callable task) :提交一个有返回值的任务用于执行,并返回一个可在未来获取任务结果的 Future。
- submit(ForkJoinTask task) :提交一个ForkJoinTask 用于执行。
- submit(Runnable task) :提交一个Runnable 任务用于执行,并返回一个该任务的Future表示。
- submit(Runnable task, T result) :提交一个 Runnable 任务用于执行,并返回一个该任务的 Future表示。
以上是三类执行任务的方法,对于三种方法的具体使用
在外部对 Fork/Join 操作调用 | 在 Fork/Join 框架范围内调用 | |
---|---|---|
异步执行 | execute(ForkJoinTask) | ForkJoinTask.fork() |
同步执行(等待子任务完成) | invoke(ForkJoinTask) | ForkJoinTask.invoke() |
执行并获得结果 | submit(ForkJoinTask) | ForkJoinTask.fork() |
以下方法可以用于监视 Fork/Join 框架的操作情况:
- awaitQuiescence(long timeout,TimeUnit unit): 如果被此池中的ForkJoinTask调用,等价于此方法:
- awaitTermination(long timeout,TimeUnit unit) :阻塞直到所有任务执行完毕。当任意以下情况出现则停止阻塞,以先发生为准:收到关闭请求、超时、线程中断。
- commonPool()返回common pool 实例。
- drainTasksTo(Collection<? superForkJoinTask<?>> c): 移除任务调度队列中所有未有效提交和已分解的任务,并将它们添加到给定的集合,但不改变其执行状态。
- getActiveThreadCount(): 返回当前正在窃取或执行任务的线程数的估计值。
- getAsyncMode(): 当使用先进先出模式时返回true
- getCommonPoolParallelism(): 返回common pool的目标并行级别
- getFactory() :返回线程工厂用于构造新的线程。
- getParallelism() :返回这个线程池的目标并行度
- getPoolSize() :返回已启动但尚未终止的工作线程数。
- getQueuedSubmissionCount() :返回还未开始运行的任务数的估计值。
- getQueuedTaskCount(): 返回工作线程的任务队列中总任务数的估计值(但不包括提交到池中但未开始执行的任务)。
- getRunningThreadCount() :返回处于未阻塞状态等待加入任务或其它同步管理的工作线程数的估计值。
- getStealCount(): 返回从其它线程任务队列中窃取的任务数估计值。
- getUncaughtExceptionHandler(): 返回内部工作线程在执行任务时遇到不可恢复的错误时的处理程序。
- hasQueuedSubmissions() :当存在已提交到当前线程池但尚未执行的任务时返回true。
- isQuiescent():当所有工作线程处于空闲时返回true。
- isShutdown() :此线程池已被关闭时返回true。
- isTerminated() :如果此池关闭后所有任务已停止,返回true。
- isTerminating() :如果此线程池正在终止任务但尚未全部终止,返回true。
- managedBlock(ForkJoinPool.ManagedBlocker blocker) :运行给定的可能阻塞任务。
- newTaskFor(Callable callable) :返回给定callable任务的RunnableFuture。
- newTaskFor(Runnable runnable, T value) :返回给定runnable任务和给定值的RunnableFuture
- pollSubmission() :如果存在下一个未运行的可用的已提交任务,将其返回并在任务队列中删除
- shutdown() :按此前提交任务的执行顺序来有序关闭任务,但不再接受新任务。
- shutdownNow() :尝试取消、停止所有任务,并拒绝所有随后提交的任务。
- toString() :返回可识别此线程池的字符串及它的状态,包括运行状态、并行级别、工作线程和任务数量。