JDK中ForkJoin框架的简单实例

package cn.abc.forkjoin.file;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;

/**
* 异步遍历文件夹,没有返回值,使用 RecursiveAction
* 在ForkJoin中还有一个有返回值的是 RecursiveTask<V>
* 该类是遍历指定路径下的所有文件,找到txt结尾的文本
*/
public class FindFileDir extends RecursiveAction {

private File path;

public FindFileDir(File path){
this.path = path;
}

public static void main(String[] args) {

     //拿到ForkJoinPool的实例,通过ForkJoinPool来同步/异步执行任务
ForkJoinPool pool = new ForkJoinPool();
FindFileDir task = new FindFileDir(new File("D:/"));

pool.execute(task);//异步调用

System.out.println("Task is running........");
try {
        //下面的求和计算是为了证明异步调用
Thread.sleep(1);
int count = 0;
for(int i = 0; i < 100; i ++){
count = count + i;
}
System.out.println("Main Thread do sth....." + "count = " + count);
task.join(); //阻塞方法,可以拿到任务执行返回结果
System.out.println("Task end!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
   //继承RecursiveAction需要覆盖的方法,也是唯一要重写的函数
@Override
protected void compute() {
List<FindFileDir> subTasks = new ArrayList<>();
     //拿到指定目录下的所有file
File[] listFiles = path.listFiles();

if(listFiles != null){
for(File file : listFiles){
//如果是目录
if(file.isDirectory()){
subTasks.add(new FindFileDir(file)); //创建新的任务放入集合中
}else{ //普通文件
if(file.getAbsolutePath().endsWith("txt")){
System.out.println("普通txt文件:" + file.getAbsolutePath());
}
}
}
        //遍历完成后,我们需要拿到任务的执行结果,invokeAll方法需要你去看一下,具体需要的参数
if(!subTasks.isEmpty()){
for(FindFileDir subTask : invokeAll(subTasks)){
subTask.join(); //具体拿到每一个任务的结果
}
}
}
}
}
posted @ 2020-04-05 17:47  文所未闻  阅读(205)  评论(0编辑  收藏  举报