diff --git a/src/main/java/com/github/hcsp/multithread/WordCount.java b/src/main/java/com/github/hcsp/multithread/WordCount.java index 51ab885..62e224d 100644 --- a/src/main/java/com/github/hcsp/multithread/WordCount.java +++ b/src/main/java/com/github/hcsp/multithread/WordCount.java @@ -1,13 +1,61 @@ package com.github.hcsp.multithread; +import java.io.BufferedReader; import java.io.File; +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.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; public class WordCount { - public WordCount(int threadNum) {} + private final int threadNum; + private ExecutorService threadPool; + + public WordCount(int threadNum) { + threadPool = Executors.newFixedThreadPool(threadNum); + this.threadNum = threadNum; + } // 统计文件中各单词的数量 - public Map count(File file) { - return null; + public Map count(File file) throws IOException, ExecutionException, InterruptedException { + BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); + List>> list = new ArrayList<>(); + Map finalResult = new HashMap<>(); + for (int i = 0; i < threadNum; ++i) { + list.add(threadPool.submit(() -> { + Map result = new HashMap<>(); + String line; + while ((line = bufferedReader.readLine())!=null) { + String[] oneThreadReadOneLine = line.split(" "); + for (String element : oneThreadReadOneLine + ) { + result.put(element, result.getOrDefault(element, 0)+1); + } + } + return result; + })); + } + + for (Future> future : list + ) { + Map resultFromThread = future.get(); + mergeResultFromThread(resultFromThread, finalResult); + } + return finalResult; + } + + private void mergeResultFromThread(Map resultFromThread, + Map finalResult) { + for (Map.Entry entry : resultFromThread.entrySet()) { + int resultNumber = finalResult.getOrDefault(entry.getKey(), 0) + entry.getValue(); + finalResult.put(entry.getKey(), resultNumber); + } } } +