fork-join详解(2)

本文详细介绍了ForkJoinPool的使用,包括异步读取磁盘文件、数组归并排序以及工作窃取原理。通过实例展示了如何利用ForkJoinPool实现高效的并行计算,并解释了LinkedBlockingDeque在其中的作用和特点。
摘要由CSDN通过智能技术生成

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)一个数组长度,可以自己设置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值