diff --git a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java index 15c4aae..82aacb2 100644 --- a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java +++ b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java @@ -1,12 +1,64 @@ package com.github.hcsp.multithread; +import java.io.BufferedReader; import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.*; public class MultiThreadWordCount1 { // 使用threadNum个线程,并发统计文件中各单词的数量 - public static Map count(int threadNum, List files) { - return null; + public static Map count(int threadNum, List files) throws FileNotFoundException, ExecutionException, InterruptedException { + ExecutorService threadPool = Executors.newFixedThreadPool(10); + Map finalResult = new HashMap<>(); + + for (File file : files) { + BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); + List>> futures = new ArrayList<>(); + + //创建线程 + for (int i = 0; i < threadNum; i++) { + futures.add(threadPool.submit(new WorkerJob(bufferedReader))); + } + //遍历线程的结果并进行整合 + for (Future> future : futures) { + Map resultFromWorker = future.get(); + mergeWorkerResultIntoFinalResult(resultFromWorker, finalResult); + } + } + return finalResult; + } + + static class WorkerJob implements Callable> { + private BufferedReader bufferedReader; + + public WorkerJob(BufferedReader bufferedReader) { + this.bufferedReader = bufferedReader; + } + + @Override + public Map call() throws Exception { + String content; + Map result = new HashMap<>(); + while ((content = bufferedReader.readLine()) != null) { + String[] words = content.split(" "); + for (String word : words) { + result.put(word, result.getOrDefault(word, 0) + 1); + } + } + return result; + } + } + + private static void mergeWorkerResultIntoFinalResult(Map resultFromWorker, Map finalResult) { + for (Map.Entry entry : resultFromWorker.entrySet()) { + String word = entry.getKey(); + int mergedResult = finalResult.getOrDefault(word, 0) + entry.getValue(); + finalResult.put(word, mergedResult); + } } }