Java并发之工具类 ForkJoin 任务分解
时间:2022-07-24
本文章向大家介绍Java并发之工具类 ForkJoin 任务分解,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Fork/Join框架的介绍
第一步分割任务。首先我们需要有一个fork类来把大任务分割成子任务,有可能子任务还是很大,所以还需要不停的分割,直到分割出的子任务足够小。
第二步执行任务并合并结果。分割的子任务分别放在双端队列里,然后几个启动线程分别从双端队列里获取任务执行。子任务执行完的结果都统一放在一个队列里,启动一个线程从队列里拿数据,然后合并这些数据。
Fork/Join使用两个类来完成以上两件事情:
- ForkJoinTask:我们要使用ForkJoin框架,必须首先创建一个ForkJoin任务。它提供在任务中执行fork()和join()操作的机制,通常情况下我们不需要直接继承ForkJoinTask类,而只需要继承它的子类,Fork/Join框架提供了以下两个子类:
- RecursiveAction:用于没有返回结果的任务。
- RecursiveTask :用于有返回结果的任务。
- ForkJoinPool :ForkJoinTask需要通过ForkJoinPool来执行,任务分割出的子任务会添加到当前工作线程所维护的双端队列中,进入队列的头部。当一个工作线程的队列里暂时没有任务时,它会随机从其他工作线程的队列的尾部获取一个任务。
package com.thread.test.thread;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
/**
* Created by windwant on 2016/6/3.
*/
public class MyForkJoin {
public static void main(String[] args) {
MyTask task = new MyTask(new File("D:\MPS"));
Integer sum = new ForkJoinPool().invoke(task);
System.out.println(sum);
}
}
class MyTask extends RecursiveTask<Integer>{
public Integer num = 0;
private File file;
MyTask(File file){
this.file = file;
}
@Override
protected Integer compute() {
List<MyTask> taskList = new ArrayList<MyTask>();
if(file.isDirectory()){
File[] list = file.listFiles();
for(File subf: list){
if(subf.isDirectory()){
MyTask mt = new MyTask(subf);
taskList.add(mt);
}else{
num++;
}
}
}else{
num = 1;
}
if(!taskList.isEmpty()){
//同下
// for(MyTask mtask: taskList){
// mtask.fork();
// }
// for(MyTask mtask: taskList){
// num += mtask.join();
// }
for(MyTask mtask: invokeAll(taskList)){
num += mtask.join();
}
}
return num;
}
}
项目地址:https://github.com/windwant/threadtest
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释