作用

ForkJoinPool继承AbstractExecutorService,提供线程池的功能

常用方法

  • execute:以异步的形式执行任务,该方法 没有返回值

  • submit:有返回值,使用ForkJoinTask的get方法获取

  • invoke:异步执行任务,直接将返回结果返回

  • shutdown:关闭任务,但不具有中断的效果

  • shutdownNow:如果跟isInterrupted==true来判断,那么会立即停止当前正在执行的任务,并不允许接收新任务;没有跟isInterrupted==true来判断,那么当前执行的任务会正常运行到结束

  • isTerminated():如果关闭后所有任务都已完成则返回true

  • isShutdown:判断任务是否关闭

  • awaitTermination:等待线程池被销毁的最长时间,具有阻塞性

  • isCompletedNormally:判断任务是否正常执行完毕

  • getException:获取任务执行时返回的异常信息

ForkJoinTask

执行任务的具体类,但该类是一个抽象类,下面三个类是其子类:

  • RecursiveAction:没有返回值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    public class RecursiveActionDemo1 extends RecursiveAction {

    private int beginValue;
    private int endValue;

    public RecursiveActionDemo1(int beginValue, int endValue) {
    this.beginValue = beginValue;
    this.endValue = endValue;
    }

    @Override
    protected void compute() {
    System.out.println(Thread.currentThread().getName() + "-----------开始");
    if (endValue - beginValue > 2) {
    int middleNum = (beginValue + endValue) / 2;
    RecursiveActionDemo1 leftAction = new RecursiveActionDemo1(beginValue, middleNum);
    RecursiveActionDemo1 rightAction = new RecursiveActionDemo1(middleNum+1, endValue);
    this.invokeAll(leftAction, rightAction);
    } else {
    System.out.println("打印组合为: " + beginValue + "---" + endValue);
    }
    System.out.println(Thread.currentThread().getName() + "-----------结束");
    }

    public static void main(String[] args) throws InterruptedException {
    ForkJoinPool forkJoinPool = new ForkJoinPool();
    forkJoinPool.submit(new RecursiveActionDemo1(1, 10));
    Thread.sleep(5000);
    }
    }
  • CountedCompleter:具有返回值
  • RecursiveTask

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class RecursiveTaskDemo1 extends RecursiveTask<Integer> {
    @Override
    protected Integer compute() {
    return 100;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
    RecursiveTaskDemo1 recursiveTaskDemo1 = new RecursiveTaskDemo1();
    ForkJoinPool forkJoinPool = new ForkJoinPool();
    ForkJoinTask<Integer> joinTask = forkJoinPool.submit(recursiveTaskDemo1);
    System.out.println("joinTask: " + joinTask.get());
    }
    }
    ForkJoinTask有两种方法获取返回值:get和join,前者遇到异常时能够进行捕获,join则直接抛出,执行多个 任务时join获取结果是同步的