From 383ffbbe5cadf3b576f6524b3c2082750060aa42 Mon Sep 17 00:00:00 2001 From: YongJieLiu <617805327@qq.com> Date: Fri, 27 Mar 2020 10:25:16 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=A4=9A=E7=BA=BF=E7=A8=8B=E7=9A=84Word=20Count?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../multithread/MultiThreadWordCount1.java | 53 ++++++++++++++++++- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java index 15c4aae..14760ab 100644 --- a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java +++ b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java @@ -1,12 +1,61 @@ 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); + } } } From 0ccc207fb43917cd661f331c5b39efc0fc8fe917 Mon Sep 17 00:00:00 2001 From: YongJieLiu <617805327@qq.com> Date: Fri, 27 Mar 2020 10:27:32 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=A4=9A=E7=BA=BF=E7=A8=8B=E7=9A=84Word=20Count?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/github/hcsp/multithread/MultiThreadWordCount1.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java index 14760ab..82aacb2 100644 --- a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java +++ b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java @@ -19,9 +19,12 @@ public static Map count(int threadNum, List files) throws 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);