本文已参与「新人创作礼」活动,一起开启掘金创作之路。
什么是Fork/Join框架?
- Fork/Join 框架是 Java7 提供了的一个用于并行执行任务的框架
- 采用分而治之的理念,并行递归实现小任务然后汇总结果
- 充分利用cpu执行任务
- 补充了ThreadPoolExecutor:因为ThreadPoolExecutor中有限的线程数和有限的队列容量因拆分任务而被阻塞无法继续拆分任务或合并任务。
Fork/Join框架常见使用方法
1.实现countedCompleter去提交任务
1-1任务编写
/**
* @Description :
* TODO 继承CountedCompleter抽象类重写任务,任务没有返回值,但是有钩子函数
* @Author : lixiunan
* @Date : 2021/7/22
**/
public class TaskCountedCompleter extends CountedCompleter {
@Override
public void compute() {
//oneTask.fork();
//twoTask.fork();
tryComplete();
}
}
1-2测试类ForkJoinPool.commonPool().invoke方式
/**
* @Description : TODO ForkJoinPool.commonPool().invoke方式执行任务
* @Author : lixiunan
* @Date : 2021/7/22
**/
public class TestCountedCompleter {
public static void main(String[] args) {
ForkJoinPool.commonPool().invoke(new TaskCountedCompleter());
}
}
2.实现RecursiveTask方法提交任务接受返回值
RecursiveTask :用于有返回结果的任务:
2-1. 任务类
/**
* @Description : TODO 重写RecursiveTask抽象方法重写任务实现方法,任务执行完有返回值
* @Author : lixiunan
* @Date : 2021/7/22
**/
@Slf4j
public class TaskRecursiveTask extends RecursiveTask {
@Override
protected Object compute() {
//taskRecursiveTask1.fork();
//taskRecursiveTask2.fork();
//Object oneResult = taskRecursiveTask1.join();
//Object twoResult = taskRecursiveTask2.join();
//return oneResult + twoResult;
}
}
2-2. 测试方法
/**
* @Description : TODO 创建ForkJoinPool对象执行任务
* @Author : lixiunan
* @Date : 2021/7/22
**/
public class TestRecursiveTask {
public static void main(String[] args) {
ForkJoinPool forkJoinPool = new ForkJoinPool(8);
forkJoinPool.execute(new TaskRecursiveTask());
}
}
3.实现RecursiveAction
RecursiveAction:用于没有返回结果的任务:
- 比如写数据到磁盘,然后就结束退出
- 一个RecursiveAction可以把自己的工作分割成更小的自己,由独立的线程或者CPU执行。
- fork分,join合并
3-1.任务实现方式
/**
* @Description : TODO 继承RecursiveAction抽象类重写任务方法,没有返回值
* @Author : lixiunan
* @Date : 2021/7/22
**/
public class TaskRecursiveAction extends RecursiveAction {
@Override
protected void compute() {
//taskRecursiveAction1.fork();
//taskRecursiveAction2.fork();
//taskRecursiveAction1.join();
//taskRecursiveAction2.join();
}
}
3-2.测试方法创建线程池执行任务
/**
* @Description : TODO
* @Author : lixiunan
* @Date : 2021/7/22
**/
public class TestRecursiveAction {
public static void main(String[] args) {
//CPU核数取值
int core = Runtime.getRuntime().availableProcessors();
//创建任务可传入参数
TaskRecursiveTask task =
new TaskRecursiveTask(...);
//创建线程池
ForkJoinPool forkJoinPool = new ForkJoinPool(core);
//执行任务
forkJoinPool.invoke(task);
}
}