Fork-Join框架
Java多线程发展
Java多线程主要有以下三个实现路径:
- Thread/Runnable/Thread组管理 (Java2提出)
- Executors框架(Java5提出)
- Fork-Join框架(Java7提出)
Fork-join概览
Fork-join是java7提出的一个框架,基于分解、治理、合并的方式来实现,适合与最小任务可确定,但是总任务量不好确定的场合。
Fork-join中的重要类
ForkJoinPool
任务池:ExecutorService
的一个实现类,是一种特殊的线程池。创建ForkJoinPool
实例后,可以调用ForkJoinPool
的submit(ForkJoinTask<T> task)
或者invoke(ForkJoinTask<T> task)
来执行指定任务。指定任务是指一个继承ForkJoinTask
类的实例,ForkJoinTask
的子类如下。
RecursiveAction
:一个ForkJoinTask的抽象子类,一般不会返回值
RecursiveTask
:一个供ForkJoinTask的抽象子类,一般会返回值,因此在继承时需指明其返回类型
例子:ForkJoin框架的使用
我们还是解决一个很大的数的和的计算问题,其方法采用Fork-join的分治策略。
先来看主线程:
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
public class SumTest {
public static void main(String[] args) throws ExecutionException, InterruptedException{
// 创建执行线程池
ForkJoinPool pool = new ForkJoinPool();
// ForkJoinPool pool = new ForkJoinPool(4); //可以定义大小
// 创建任务
SumTask task = new SumTask(1,10000000);
// 提交任务,注意这里使用ForkJoinTask实例来接收task的结果
ForkJoinTask<Long> result = pool.submit(task);
// 等待结果
do {