当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Java ForkJoinPool Class用法及代码示例


ForkJoinPool 类是 fork/join 框架的中心,它是 ExecutorService 接口的实现。 ForkJoinPool 类是 AbstractExecutorService 类的扩展,它实现了 fork/join 框架的 work-stealing 算法(即,没有事情可做的工作线程可以从其他仍然忙碌的线程中窃取任务)并可以执行ForkJoinTask进程。

ForkJoinPool 类从 java.util.concurrent.AbstractExecutorService 类继承以下方法:

  • invokeAll()
  • invokeAny()

ForkJoinPool 类从继承自类 java.lang.Object 类的Methods 继承以下方法:

  • clone()
  • equals()
  • finalize()
  • getClass()
  • hashCode()
  • notify()
  • notifyAll()
  • wait()

用法:

public class ForkJoinPool extends AbstractExecutorService  

Fork:Fork步骤将任务分割成更小的子任务,并且这些任务并发执行。

Join:子任务执行后,任务可能会将所有结果连接成一个结果。

如下图所示:

ForkJoinPool-Class-in-Java-with-Examples

例子:

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

用法

public int getActiveThreadCount()

Java


// Java program to demonstrate the
// Implementation of getActiveThreadCount()
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
class NewTask extends RecursiveAction 
{
    private long Load = 0;
     
    public NewTask(long Load) { this.Load = Load; }
    protected void compute()
    {
        // fork tasks into smaller subtasks
        List<NewTask> subtasks = new ArrayList<NewTask>();
        subtasks.addAll(createSubtasks());
         
        for (RecursiveAction subtask : subtasks) {
            subtask.fork();
        }
    }
     
    // function to create and add subtasks
    private List<NewTask> createSubtasks()
    {
        // create subtasks
        List<NewTask> subtasks = new ArrayList<NewTask>();
        NewTask subtask1 = new NewTask(this.Load / 2);
        NewTask subtask2 = new NewTask(this.Load / 2);
        NewTask subtask3 = new NewTask(this.Load / 2);
         
        // to add the subtasks
        subtasks.add(subtask1);
        subtasks.add(subtask2);
        subtasks.add(subtask3);
         
        return subtasks;
    }
}
public class JavaForkJoingetActivethreadcountExample1 {
    public static void main(final String[] arguments)
        throws InterruptedException
    {
        // get no. of available core available
        int proc = Runtime.getRuntime().availableProcessors();
         
        System.out.println("Number of available core in the processor is: "
            + proc);
             
        // get no. of threads active
        ForkJoinPool Pool = ForkJoinPool.commonPool();
         
        System.out.println("Number of active thread before invoking: "
            + Pool.getActiveThreadCount());
             
        NewTask t = new NewTask(400);
         
        Pool.invoke(t);
         
        System.out.println("Number of active thread after invoking: "
            + Pool.getActiveThreadCount());
        System.out.println("Common Pool Size is: "
                           + Pool.getPoolSize());
    }
}


输出
Number of available core in the processor is: 4
Number of active thread before invoking: 0
Number of active thread after invoking: 3
Common Pool Size is: 3

Methods of ForkJoinPool Class

METHOD

DESCRIPTION

public boolean waitQuithesis(长时间超时,TimeUnit单位) 此方法执行池直到池静止,否则,协助执行任务直到指定的时间值和单位过去或池静止。
public boolean waitTermination(长超时,TimeUnit单位) 此方法会阻塞,直到所有任务在关闭请求后完成执行,或者发生超时,或者当前线程被中断,以先发生者为准。
公共静态ForkJoinPool commonPool() 该方法返回公共池实例。
公共无效执行(可运行任务) 此方法在将来的某个时间执行给定的命令。
公共 int getActiveThreadCount() 此方法返回当前正在窃取或执行任务的线程的估计数量。它可能会高估活动线程的数量。
公共布尔值getAsyncMode() 如果此池对从未加入的分叉任务使用本地先进先出调度模式,则此方法返回 true。
公共静态int getCommonPoolParallelism() 此方法返回公共池的目标并行度级别。
公共 ForkJoinPool.ForkJoinWorkerThreadFactory getFactory() 此方法返回用于构造新工人的工厂。
公共 int getParallelism() 此方法返回该池的目标并行度级别。
公共 int getPoolSize() 此方法返回已启动但尚未终止的工作线程数。
公共 int getQueuedSubmissionCount() 此方法返回提交到此池但尚未开始执行的任务数量的估计值。
公共长getQueuedTaskCount() 此方法返回当前由工作线程保留在队列中的任务总数的估计值
公共 int getRunningThreadCount() 此方法返回未阻塞等待加入任务或其他托管同步的工作线程数量的估计值。
公共长getStealCount() 此方法返回一个线程的工作队列中被另一个线程窃取的任务总数的估计值。
公共 Thread.UncaughtExceptionHandler getUncaughtExceptionHandler() 此方法返回由于执行任务时遇到不可恢复的错误而终止的内部工作线程的处理程序。
公共布尔值hasQueuedSubmissions() 如果有任何任务提交到此池但尚未开始执行,则此方法返回 true。
公共 <T> T 调用(ForkJoinTask<T> 任务) 此方法执行给定的任务并在完成后返回其结果。
公共布尔值isQuiescent() 如果所有工作线程当前都处于空闲状态,则此方法返回 true。
公共布尔值isShutdown() 如果调用 isShutdown() 的池已关闭,则此方法返回 true。
公共布尔值isTerminated() 如果关闭后所有任务均已完成,则此方法返回 true。
公共布尔值isTerminating() 如果终止过程已开始但尚未完成,则此方法返回 true。
protected <T> RunnableFuture<T> newTaskFor(Callable<T> 可调用) 此方法返回一个 RunnableFuture,它在运行时将调用底层可调用对象,并且作为 Future,将产生可调用对象的结果作为其结果,并提供底层任务的取消。
公共无效shutdown() 如果该池已关闭,则此方法返回 true。
公共列表<可运行> shutdownNow() 此方法可能会尝试取消和/或停止所有任务,并拒绝所有随后提交的任务。
public ForkJoinTask<?> 提交(可运行任务) 此方法提交一个 Runnable 任务以供执行,并返回代表该任务的 Future。
公共字符串toString() 此方法返回一个标识该池及其状态的字符串,包括运行状态、并行级别以及工作线程和任务计数的指示。


相关用法


注:本文由纯净天空筛选整理自surbhityagi15大神的英文原创作品 ForkJoinPool Class in Java with Examples。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。