并发编程-ForkJoin的简单应用

* RecursiveAction 无返回值 RecursiveTask 带返回值
* 模拟从本地扫盘 遇到text输出 如果是文件夹类型则继续扫
* 使用ForkJoin 可以解决单线程IO阻塞导致时间浪费的问题
但是会有线程消耗(线程切换会有上下文切换所带来的时间消耗,以及刚开始创建线程的时间消耗)
* 任务量小速度不如单线程,任务量大的时候效率非常高

package day01.interrupted;

import java.io.File;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;

/**
 * @Author 小浩
 * @Date 2020/6/3 14:30
 * @Version 1.0
 **/

/**
 * RecursiveAction 无返回值 RecursiveTask 带返回值
 * 模拟从本地扫盘 遇到text输出 如果是文件夹类型则继续扫
 * 使用ForkJoin 可以解决单线程IO阻塞导致时间浪费的问题
 * 任务量小速度不如单线程,任务量大的时候效率非常高
 */
public class ForkJoinTask extends RecursiveAction {

    private File path;

    public ForkJoinTask(File path) {
        this.path = path;

    }

    @Override
    protected void compute() {
        List<ForkJoinTask> list = new ArrayList<>();
        File[] files = path.listFiles();
        if (files != null) {
            for (File file : files) {
                if (file.isDirectory()) {
                    list.add(new ForkJoinTask(file));
                } else {
                    if (file.getAbsolutePath().endsWith("txt")) {
                        System.out.println(file.getAbsolutePath());
                    }
                }
            }
//           以集合的形式提交任务
            for (ForkJoinTask forkJoinTask : invokeAll(list)) {
//               等待子任务执行完成
                forkJoinTask.join();
            }
        }


    }

    public static void main(String[] args) {
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        ForkJoinTask forkJoinTask = new ForkJoinTask(new File("D:/"));
        forkJoinPool.invoke(forkJoinTask);


    }
}

 

输出结果:

© 版权声明
THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发