diff --git a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java index 15c4aae..94e3ced 100644 --- a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java +++ b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java @@ -1,12 +1,56 @@ package com.github.hcsp.multithread; -import java.io.File; -import java.util.List; -import java.util.Map; +import java.io.*; +import java.util.*; +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 IOException, ExecutionException, InterruptedException { + ExecutorService threadPool = Executors.newFixedThreadPool(threadNum); + HashMap resultMap = new HashMap<>(); + + for (File file : files) { + HashMap OneFileResultMap = new HashMap<>(); + BufferedReader reader = new BufferedReader(new FileReader(file)); + List>> futureList = new ArrayList<>(); + + for (int i = 0; i < 0; i++) { + Future> future = threadPool.submit(new Callable>() { + @Override + public Map call() throws Exception { + HashMap oneLineMap = new HashMap<>(); + String line = null; + while ((line = reader.readLine()) != null) { + String[] words = line.split(" "); + for (String word : words) { + oneLineMap.put(word, oneLineMap.getOrDefault(word, 0) + 1); + } + } + return oneLineMap; + } + }); + futureList.add(future); + } + mergeOneLineCountToOneFileCount(OneFileResultMap, futureList); + mergeOneLineCountToOneFileCountByMap(resultMap, OneFileResultMap); + } + return resultMap; + } + + private static void mergeOneLineCountToOneFileCountByMap(Map resultMap, + Map oneFileResultMap) { + Set keys = oneFileResultMap.keySet(); + for (String key : keys) { + resultMap.put(key, oneFileResultMap.getOrDefault(key, oneFileResultMap.get(key))); + } + } + + private static void mergeOneLineCountToOneFileCount(HashMap oneFileResultMap, + List>> futureList) throws ExecutionException, InterruptedException { + for (Future> futures : futureList) { + Map oneLineResult = futures.get(); + mergeOneLineCountToOneFileCountByMap(oneFileResultMap, oneLineResult); + } } } diff --git a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount2.java b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount2.java index 3f23afa..fc3867c 100644 --- a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount2.java +++ b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount2.java @@ -1,8 +1,55 @@ package com.github.hcsp.multithread; +import java.io.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + public class MultiThreadWordCount2 { - // 使用threadNum个线程,并发统计文件中各单词的数量 - // public static Map count(int threadNum, List files) { - // return null; - // } + + //使用threadNum个线程,并发统计文件中各单词的数量 + public static Map count(int threadNum, List files) throws IOException { + HashMap resultMap = new HashMap<>(); + for (File file : files) { + BufferedReader reader = new BufferedReader(new FileReader(file)); + Object lock = new Object(); + HashMap oneFileResultMap = new HashMap<>(); + for (int i = 0; i < 9; i++) { + new Thread(() -> { + synchronized (lock) { + String line = null; + while (true) { + try { + if (!((line = reader.readLine()) != null)) { + break; + } + } catch (IOException e) { + e.printStackTrace(); + } + String[] words = line.split(" "); + for (String word : words) { + if (oneFileResultMap.containsKey(word)) { + oneFileResultMap.put(word, oneFileResultMap.get(word) + 1); + } else { + oneFileResultMap.put(word, 1); + } + } + } + } + }); + } + mergeOneLineCountToOneFileCountByMap(resultMap, oneFileResultMap); + } + return resultMap; + } + + + private static void mergeOneLineCountToOneFileCountByMap(Map resultMap, + Map oneFileResultMap) { + Set keys = oneFileResultMap.keySet(); + for (String key : keys) { + resultMap.put(key, oneFileResultMap.getOrDefault(key, oneFileResultMap.get(key))); + } + } }