利用Fork/Join框架来统计某个字符串在某个文件夹的文件中出现的次数

简介: 需求:利用Fork/Join框架来统计某个字符串在某个文件夹的文件中出现的次数。主要用到的技术点:JDK8的Stream、Lambda表达式、Fork/Join框架.如果对于Fork/Join不了解的话可以参考这里:http://www.infoq.com/cn/articles/fork-join-introduction、http://ifeve.com/fork-
需求:利用Fork/Join框架来统计某个字符串在某个文件夹的文件中出现的次数。主要用到的技术点:JDK8的Stream、Lambda表达式、Fork/Join框架.

如果对于Fork/Join不了解的话可以参考这里:http://www.infoq.com/cn/articles/fork-join-introductionhttp://ifeve.com/fork-join-1/http://www.iteye.com/topic/643724 。主要代码如下:

package com.zkn.fullstacktraining.seventh;

import com.google.common.collect.Lists;
import javafx.util.Pair;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;
import java.util.concurrent.RecursiveTask;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

/**
 * Created by wb-zhangkenan on 2017/2/6.
 * 通过Fork/Join的方式来统计某个字符串在某个文件夹下的文件中出现的次数
 */
public class SearchStringByForkJoin extends RecursiveTask<List<Pair<String, Integer>>> {
    //任务的阀值
    private static final int THRESHOLD = 5;
    //任务区间的开始值
    private int start;
    //任务区间的结束值
    private int end;
    //所有的路径信息
    private List<Path> allPaths;

    public SearchStringByForkJoin(int start, int end, List<Path> allPaths) {
        this.start = start;
        this.end = end;
        this.allPaths = allPaths;
    }

    public static void main(String[] args) {

        ForkJoinPool forkJoinPool = new ForkJoinPool();
        try {
            List<Path> pathList = Files.walk(Paths.get("D:\\CUST\\WORK\\Exercises\\FullStackTraining\\src\\main\\java\\com\\zkn"), 4)
                    .filter(file -> !Files.isDirectory(file) && file.toString().endsWith("java"))
                    .collect(Collectors.toList());
            SearchStringByForkJoin searchStringByForkJoin = new SearchStringByForkJoin(0, pathList.size(), pathList);
            Future<List<Pair<String, Integer>>> result =
                    forkJoinPool.submit(searchStringByForkJoin);
            List<Pair<String, Integer>> pairList = result.get();
            pairList.stream()
                    .filter(pair -> pair.getValue() > 0)
                    .sorted((s1, s2) -> Integer.compare(s2.getValue(), s1.getValue()))
                    .forEach(pair -> System.out.println(String.format("%d次出现在%s文件中", pair.getValue(), pair.getKey().toString())));
            forkJoinPool.shutdown();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

    /**
     * The main computation performed by this task.
     * @return the result of the computation
     */
    @Override
    protected List<Pair<String, Integer>> compute() {
        List<Pair<String, Integer>> pairList = Lists.newArrayList();
        boolean canCompute = end - start <= THRESHOLD;
        if (canCompute) {
            pairList = IntStream.range(start, end + 1).mapToObj(i -> {
                //到集合的结尾了
                if (i == allPaths.size())
                    return new Pair<>("", 0);
                int sum = 0;
                try {
                    Optional optional = Files.lines(allPaths.get(i)).map(file -> {
                        int count = 0;
                        int flag = file.indexOf("main");
                        if (flag >= 0) {
                            do {
                                count++;
                            } while ((flag = file.indexOf("main", flag + 1)) > 0);
                        }
                        return count;
                    }).reduce(Integer::sum);
                    sum = optional.isPresent() ? (int) optional.get() : 0;
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return new Pair<>(allPaths.get(i).toString(), sum);
            }).collect(Collectors.toList());
        } else {
            //取中间值
            int middle = (end + start) / 2;
            //创建Fork子任务
            SearchStringByForkJoin leftFork = new SearchStringByForkJoin(start, middle, allPaths);
            //创建Fork子任务
            SearchStringByForkJoin rightFork = new SearchStringByForkJoin(middle + 1, end, allPaths);
            //执行子任务
            leftFork.fork();
            rightFork.fork();
            //合并子任务的结果集
            pairList.addAll(leftFork.join());
            pairList.addAll(rightFork.join());
        }
        return pairList;
    }
}
相关文章
|
人工智能 自然语言处理 安全
产品更新|宜搭AI助理、精品应用产品力、专属宜搭多项功能升级!
本期功能更新已全量发布,可直接在宜搭内体验。
668 0
产品更新|宜搭AI助理、精品应用产品力、专属宜搭多项功能升级!
|
机器学习/深度学习 缓存 并行计算
NVIDIA Tesla GPU系列P4、T4、P40以及V100参数性能对比
NVIDIA Tesla系列GPU适用于高性能计算(HPC)、深度学习等超大规模数据计算,Tesla系列GPU能够处理解析PB级的数据,速度比使用传统CPU快几个数量级,NVIDIA Tesla GPU系列P4、T4、P40以及V100是Tesla GPU系列的明星产品,云服务器吧分享NVIDIA Tesla GPU系列P4、T4、P40以及V100参数性能对比:
|
前端开发 JavaScript
你可能不知道的一些关于a标签的小细节
本篇文章详细介绍了关于a标签的几个小细节,也可以说是一些sao操作,完全可以在开发中使用,体验非常奈斯
374 0
你可能不知道的一些关于a标签的小细节
|
云安全 弹性计算 运维
阿里云ACP考试都有什么方向?考试内容难不难?
现在越来越多的人都打算考一个认证来提升自己的竞争力,以便获得更好的发展,而阿里云ACP可以说是现在ICT行业内非常具有含金量的证书了,很多人都想考一个证书来帮助自己升职加薪。但是关于证书的详细事项,很多人还是不能理解,接下来小编就详细介绍一下
阿里云ACP考试都有什么方向?考试内容难不难?
|
机器学习/深度学习 传感器 自动驾驶
英特尔153亿美元收购Mobileye的背后,自动驾驶芯片之争愈演愈烈
硬件巨头英特尔与 Mobileye 于 3 月 13 日上午共同宣布了一项最终协议:英特尔即将收购 Mobileye NV——这家全球领先的计算及视觉、机器学习、数据分析、本地化辅助系统和自动驾驶系统服务提供商。
821 0
英特尔153亿美元收购Mobileye的背后,自动驾驶芯片之争愈演愈烈
|
Android开发
Android 判断手机设备是否是小米,华为,魅族设备
Android 判断手机设备是否是小米,华为,魅族设备
2295 0
Android 判断手机设备是否是小米,华为,魅族设备
|
Shell
如何生成RSA2密钥
密钥文件说明:    1、rsa_private_key.pem:原始私钥(又称pkcs1私钥),适用于非Java开发语言;  2、rsa_private_key_pkcs8.pem:pkcs8私钥,适用于Java开发语言;  3、rsa_public_key.pem:商户公钥,需上传至应用中加签方式的应用公钥位置。
2273 11
|
SQL 消息中间件 分布式计算
持续更新!实时计算及 Flink 大厂招聘信息汇总
大家好,为帮助大家更好的找到适合的岗位,拿到心仪公司的offer,社区收集了多家实时计算及 Flink 企业用户的招聘需求,如:知乎、VIPKID、新氧、作业帮、得物、好未来、阿里巴巴等招聘信息,整理如下,供大家参考。
持续更新!实时计算及 Flink 大厂招聘信息汇总
|
机器学习/深度学习 新零售 自然语言处理
理解图神经网络预训练 | KDD论文解读
图表示学习目前受到了广泛关注,但目前绝大多数的图表示学习方法都是针对特定领域的图进行学习和建模,所产出的图神经网络难以迁移。
理解图神经网络预训练 | KDD论文解读