4.fork-join实战异步读取磁盘文件
本次采用execute异步来启动ForkJoinPool,小伙伴们可以看启动结果跟invoke启动的区别
具体思路:
1.首先拿到我当前这个磁盘下的所有文件遍历循环
2.循环中判断文件是否是目录,如果是目录再次使用递归任务进行任务添加
3.如果不是目录就输出文件路径
4.对添加到目录递归任务集合中的数据再次进行递归
具体代码:
public class main {
//读取文件任务对象
static class FileTask extends RecursiveAction {
private File file;
public FileTask(File file) {
this.file = file;
}
@Override
protected void compute() {
List<FileTask> fileTasks=new LinkedList<>();
File[] files=file.listFiles();
if(files!=null){
for (File file:files){
//如果内部文件还是目录再次进行递归读取
if(file.isDirectory()){
fileTasks.add(new FileTask(file));
}else{
System.out.println(file.getAbsolutePath());
}
}
//递归读取目录中的文件,把任务丢进去执行,然后这里进行使用join进行等待完成
for (FileTask fileTask:invokeAll(fileTasks)){
fileTask.join();
}
}
}
}
public static void main(String[] args) {
ForkJoinPool forkJoinPool=new ForkJoinPool();
FileTask fileTask=new FileTask(new File("E:/"));
//采用异步提交让主线程可以做其他的事情
forkJoinPool.execute(fileTask);
System.out.println("主线程还可以处理其他的事件");
for (int i = 0; i < 3; ++i) {
System.out.println("主线程吃了"+(i+1)+"碗饭");
}
//进入阻塞
fileTask.join();
System.out.println("所以线程执行完毕!");
}
}
执行结果:
画红框的表示执行到forkJoinPool.execute不会阻塞还可以继续往下面执行
5.fork-join实战数组归并排序(升序)
具体思路:
1.把随机生成3亿长度的数组拆分到最小单位,即上面数组生成中设置的阈值,(3亿除于10=30000000)一个数组长度,可以自己设置