栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java:Word Count

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java:Word Count

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;

public class Test {
    public static void main(String[] args) throws IOException {
        //file stream
        //文件切割

        //希望将文件切割成几份
        final int NUM = 5;
        //该文件一共有多少行
        List> article = new ArrayList<>();
        for (int i = 0; i < NUM; i++) {
            article.add(new ArrayList<>());
        }

        BufferedReader reader =
                new BufferedReader(new FileReader("data/Broken to Harness.txt"));
        String line = null; //记录读取到的行
        int count = 0;
        while (null!=(line=reader.readLine())){
            line = line.trim();
            //去除空行
            if (line.length()==0) {
                continue;
            }
            //把行中无效字符去除
            line = line.replaceAll(",|\.|\?|"|!|;|:", "");
            article.get((count++)%NUM).add(line);
        }
        reader.close();

        

        // 并行处理:多线程   word:String -> count:Integer
        List>> array = new ArrayList<>();
        ExecutorService pool = Executors.newFixedThreadPool(5);
        CountDownLatch latch = new CountDownLatch(5);
        for (List list : article) {
            // 每个list就是一个部分
            // 匿名内部类
            
            // lambda 箭头函数
            Future> submit = pool.submit(() -> {
                //在线程内部执行:并发
                HashMap map = new HashMap<>();
                for (String row : list) {
                    //将文章中的一行以空格拆分成多个单词的数组
                    String[] words = row.split("\s+");
                    //将单词一一取出
                    for (String word : words) {
                        //存放到 map 中
                        map.put(word, map.getOrDefault(word, 0) + 1);
                        String name = Thread.currentThread().getName();
                        System.out.println(name+"t"+word);
                    }
                }
                try {
                    return map;
                }finally {
                    latch.countDown(); //减少1
                    System.out.println(latch.getCount());
                }
            });
            array.add(submit);
        }

        try {
            //等待并行执行的线程结束, latch降为0之前一直阻塞
            latch.await();

            //及时清理资源
            pool.shutdown(); //关闭线程池

            for (List list : article) {
                list.clear(); //集合中嵌套的集合置空
            }
            article.clear(); //集合置空
            article = null; //让集合的应用指向空

            // 线程不安全的集合,并发处理会引发:java.util.ConcurrentModificationException
            // Map => HashMap 线程不安全
            // Map => Hashtable 线程安全(老版:单锁机制)
            // ConcurrentMap => ConcurrentHashMap 线程安全(新版:分段锁)

            // 最终合并
            Map finalMap = new HashMap<>();
            for (Future> mapFuture : array) {
                //future.get()会阻塞等待线程执行完毕
                try {
                    Map map = mapFuture.get();
                    //主线程
                    for (Map.Entry e : map.entrySet()) {
                        String word = e.getKey();
                        int _count = e.getValue();
                        finalMap.put(word, finalMap.getOrDefault(word,0) + _count);
                    }
                    //清理
                    map.clear();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
            }

            //及时清理资源
            array.clear();

            //呈现最终结果
            finalMap.forEach((k,v)-> System.out.println(k+"t"+v));

            finalMap.clear();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/749755.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号