From ff1514217438eef1e23f5b20ccc25bdbc4a73a26 Mon Sep 17 00:00:00 2001 From: pccmast Date: Mon, 7 Dec 2020 16:44:39 +0800 Subject: [PATCH 1/4] test faults --- .../java/com/github/hcsp/multithread/1.txt | 3 + .../java/com/github/hcsp/multithread/2.txt | 3 + .../java/com/github/hcsp/multithread/3.txt | 3 + .../java/com/github/hcsp/multithread/4.txt | 3 + .../java/com/github/hcsp/multithread/5.txt | 3 + .../java/com/github/hcsp/multithread/6.txt | 3 + .../multithread/MultiThreadWordCount1.java | 68 ++++++++++++++- .../multithread/MultiThreadWordCount2.java | 83 ++++++++++++++++++- 8 files changed, 164 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/github/hcsp/multithread/1.txt create mode 100644 src/main/java/com/github/hcsp/multithread/2.txt create mode 100644 src/main/java/com/github/hcsp/multithread/3.txt create mode 100644 src/main/java/com/github/hcsp/multithread/4.txt create mode 100644 src/main/java/com/github/hcsp/multithread/5.txt create mode 100644 src/main/java/com/github/hcsp/multithread/6.txt diff --git a/src/main/java/com/github/hcsp/multithread/1.txt b/src/main/java/com/github/hcsp/multithread/1.txt new file mode 100644 index 0000000..ee98119 --- /dev/null +++ b/src/main/java/com/github/hcsp/multithread/1.txt @@ -0,0 +1,3 @@ +I am a teacher +I am a person +1 \ No newline at end of file diff --git a/src/main/java/com/github/hcsp/multithread/2.txt b/src/main/java/com/github/hcsp/multithread/2.txt new file mode 100644 index 0000000..1540a45 --- /dev/null +++ b/src/main/java/com/github/hcsp/multithread/2.txt @@ -0,0 +1,3 @@ +I am a teacher +I am a person +2 \ No newline at end of file diff --git a/src/main/java/com/github/hcsp/multithread/3.txt b/src/main/java/com/github/hcsp/multithread/3.txt new file mode 100644 index 0000000..2820c76 --- /dev/null +++ b/src/main/java/com/github/hcsp/multithread/3.txt @@ -0,0 +1,3 @@ +I am a teacher +I am a person +3 \ No newline at end of file diff --git a/src/main/java/com/github/hcsp/multithread/4.txt b/src/main/java/com/github/hcsp/multithread/4.txt new file mode 100644 index 0000000..a08a52c --- /dev/null +++ b/src/main/java/com/github/hcsp/multithread/4.txt @@ -0,0 +1,3 @@ +I am a teacher +I am a person +4 \ No newline at end of file diff --git a/src/main/java/com/github/hcsp/multithread/5.txt b/src/main/java/com/github/hcsp/multithread/5.txt new file mode 100644 index 0000000..705b9bd --- /dev/null +++ b/src/main/java/com/github/hcsp/multithread/5.txt @@ -0,0 +1,3 @@ +I am a teacher +I am a person +5 \ No newline at end of file diff --git a/src/main/java/com/github/hcsp/multithread/6.txt b/src/main/java/com/github/hcsp/multithread/6.txt new file mode 100644 index 0000000..824c25f --- /dev/null +++ b/src/main/java/com/github/hcsp/multithread/6.txt @@ -0,0 +1,3 @@ +I am a teacher +I am a person +6 \ No newline at end of file diff --git a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java index 15c4aae..2617eb4 100644 --- a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java +++ b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java @@ -1,12 +1,76 @@ 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 { + List>> resultsFuture = new ArrayList<>(); + ExecutorService threadPool = Executors.newFixedThreadPool(threadNum); + for (File file : files) { + BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); + Future> mapFuture = threadPool.submit(new readFileCallable(bufferedReader)); + resultsFuture.add(mapFuture); + } + threadPool.shutdown(); + return mergeCountResults(resultsFuture); + } + + private static Map mergeCountResults(List>> resultsFuture) throws ExecutionException, InterruptedException { + Map finalResults = new HashMap<>(); + for (Future> mapFuture : resultsFuture) { + Map stringIntegerMap = mapFuture.get(); + for (Map.Entry stringIntegerEntry : stringIntegerMap.entrySet()) { + String word = stringIntegerEntry.getKey(); + int updatedValue = finalResults.getOrDefault(word, 0) + stringIntegerEntry.getValue(); + finalResults.put(word, updatedValue); + } + } + return finalResults; + } + + public static class readFileCallable implements Callable> { + BufferedReader bufferedReader; + + public readFileCallable(BufferedReader bufferedReader) { + this.bufferedReader = bufferedReader; + } + + @Override + public Map call() throws Exception { + Map fileWords = new HashMap<>(); + String line; + while ((line = bufferedReader.readLine()) != null) { + String[] words = line.split(" "); + for (String word : words) { + fileWords.put(word, fileWords.getOrDefault(word, 0) + 1); + } + } + return fileWords; + } + } + + public static void main(String[] args) throws FileNotFoundException, ExecutionException, InterruptedException { + List files = new ArrayList<>(); + files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\1.txt")); + files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\2.txt")); + files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\3.txt")); + files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\4.txt")); + files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\5.txt")); + files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\6.txt")); + Map results = MultiThreadWordCount1.count(5, files); + for (Map.Entry resultEntry : results.entrySet()) { + System.out.println("Key: " + resultEntry.getKey()+" Value: " + resultEntry.getValue()); + } } } + diff --git a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount2.java b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount2.java index 3f23afa..c9a3e62 100644 --- a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount2.java +++ b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount2.java @@ -1,8 +1,85 @@ package com.github.hcsp.multithread; +import java.io.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.ForkJoinTask; +import java.util.concurrent.RecursiveTask; + public class MultiThreadWordCount2 { // 使用threadNum个线程,并发统计文件中各单词的数量 - // public static Map count(int threadNum, List files) { - // return null; - // } + // 使用ForkJoinPool + public static Map count(int threadNum, List files) { + ForkJoinPool forkJoinPool = new ForkJoinPool(threadNum); + ForkJoinTask> task = new readFileWordTask(files); + return forkJoinPool.invoke(task); + } + + public static class readFileWordTask extends RecursiveTask> { + private static final int THRESHOLD = 5; + List files; + + public readFileWordTask(List files) { + this.files = files; + } + + @Override + protected Map compute() { + Map results = null; + if (files.size() < THRESHOLD) { + for (File file : files) { + try { + BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); + results = new ConcurrentHashMap<>(); + String line; + while ((line = bufferedReader.readLine()) != null) { + String[] words = line.split(" "); + for (String word : words) { + results.put(word, results.getOrDefault(word, 0) + 1); + } + } + System.out.println(file.getCanonicalFile()); + } catch (IOException e) { + e.printStackTrace(); + } + } + } else { + List subFiles1 = files.subList(0, files.size() / 2); + List subFiles2 = files.subList(files.size() / 2, files.size()); + readFileWordTask subTask1 = new readFileWordTask(subFiles1); + readFileWordTask subTask2 = new readFileWordTask(subFiles2); + invokeAll(subTask1, subTask2); + Map subResult1 = subTask1.join(); + Map subResult2 = subTask2.join(); + results = mergeTwoMap(subResult1, subResult2); + } + return results; + } + + private Map mergeTwoMap(Map subResult1, Map subResult2) { + Map results = new ConcurrentHashMap<>(subResult1); + for (Map.Entry stringIntegerEntry : subResult2.entrySet()) { + String word = stringIntegerEntry.getKey(); + results.put(word, subResult2.getOrDefault(word, 0) + 1); + } + return results; + } + } + + public static void main(String[] args) throws IOException { + List files = new ArrayList<>(); + files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\1.txt")); + files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\2.txt")); + files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\3.txt")); + files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\4.txt")); + files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\5.txt")); + files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\6.txt")); + Map results = MultiThreadWordCount2.count(5, files); + for (Map.Entry resultEntry : results.entrySet()) { + System.out.println("Key: " + resultEntry.getKey()+" Value: " + resultEntry.getValue()); + } + } } From b1b7b871caf3e159b215b0c109658c3d617e2aee Mon Sep 17 00:00:00 2001 From: pccmast Date: Tue, 8 Dec 2020 16:44:51 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=A4=9A=E7=BA=BF?= =?UTF-8?q?=E7=A8=8Bwordcount?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../multithread/MultiThreadWordCount2.java | 25 ++--- .../multithread/MultiThreadWordCount3.java | 92 ++++++++++++++++++- 2 files changed, 102 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount2.java b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount2.java index c9a3e62..d340965 100644 --- a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount2.java +++ b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount2.java @@ -15,11 +15,12 @@ public class MultiThreadWordCount2 { public static Map count(int threadNum, List files) { ForkJoinPool forkJoinPool = new ForkJoinPool(threadNum); ForkJoinTask> task = new readFileWordTask(files); - return forkJoinPool.invoke(task); + Map taskResults = forkJoinPool.invoke(task); + return taskResults; } public static class readFileWordTask extends RecursiveTask> { - private static final int THRESHOLD = 5; + private static final int THRESHOLD = 3; List files; public readFileWordTask(List files) { @@ -28,12 +29,11 @@ public readFileWordTask(List files) { @Override protected Map compute() { - Map results = null; - if (files.size() < THRESHOLD) { + if (files.size() <= 6) { + Map results = new ConcurrentHashMap<>(); for (File file : files) { try { BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); - results = new ConcurrentHashMap<>(); String line; while ((line = bufferedReader.readLine()) != null) { String[] words = line.split(" "); @@ -41,11 +41,12 @@ protected Map compute() { results.put(word, results.getOrDefault(word, 0) + 1); } } - System.out.println(file.getCanonicalFile()); + // System.out.println(file.getCanonicalFile()); } catch (IOException e) { e.printStackTrace(); } } + return results; } else { List subFiles1 = files.subList(0, files.size() / 2); List subFiles2 = files.subList(files.size() / 2, files.size()); @@ -54,22 +55,22 @@ protected Map compute() { invokeAll(subTask1, subTask2); Map subResult1 = subTask1.join(); Map subResult2 = subTask2.join(); - results = mergeTwoMap(subResult1, subResult2); + return mergeTwoMap(subResult1, subResult2); } - return results; } private Map mergeTwoMap(Map subResult1, Map subResult2) { - Map results = new ConcurrentHashMap<>(subResult1); - for (Map.Entry stringIntegerEntry : subResult2.entrySet()) { + Map results = new ConcurrentHashMap<>(subResult2); + for (Map.Entry stringIntegerEntry : subResult1.entrySet()) { String word = stringIntegerEntry.getKey(); - results.put(word, subResult2.getOrDefault(word, 0) + 1); + int countNum = results.getOrDefault(word, 0) + stringIntegerEntry.getValue(); + results.put(word, countNum); } return results; } } - public static void main(String[] args) throws IOException { + public static void main(String[] args) { List files = new ArrayList<>(); files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\1.txt")); files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\2.txt")); diff --git a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount3.java b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount3.java index e180ee2..28b60e2 100644 --- a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount3.java +++ b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount3.java @@ -1,8 +1,94 @@ package com.github.hcsp.multithread; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +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.CountDownLatch; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.CopyOnWriteArrayList; + + public class MultiThreadWordCount3 { // 使用threadNum个线程,并发统计文件中各单词的数量 - // public static Map count(int threadNum, List files) { - // return null; - // } + // 使用CountDownLatch + + public static Map count(int threadNum, List files) throws FileNotFoundException { + CountDownLatch countDownLatch = new CountDownLatch(files.size()); + List> mapList = new CopyOnWriteArrayList<>(); + Map results = new HashMap<>(); + ExecutorService pool = Executors.newFixedThreadPool(threadNum); + for (File file : files) { + BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); + pool.execute(new ReadFileRunnable(bufferedReader, mapList, countDownLatch)); + } + try { + countDownLatch.await(); + for (Map map : mapList) { + for (Map.Entry stringIntegerEntry : map.entrySet()) { + String word = stringIntegerEntry.getKey(); + int countNum = results.getOrDefault(word, 0) + stringIntegerEntry.getValue(); + results.put(word, countNum); + } + } + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + pool.shutdown(); + } + return results; + } + + public static class ReadFileRunnable implements Runnable { + BufferedReader bufferedReader; + List> mapList; + CountDownLatch latch; + + public ReadFileRunnable(BufferedReader bufferedReader, List> mapList, CountDownLatch latch) { + this.bufferedReader = bufferedReader; + this.mapList = mapList; + this.latch = latch; + } + + @Override + public void run() { + Map fileResults = new HashMap<>(); + String line = null; + while (true) { + try { + if ((line = bufferedReader.readLine()) == null) break; + } catch (IOException e) { + e.printStackTrace(); + } + String[] words = line.split(" "); + for (String word : words) { + fileResults.put(word, fileResults.getOrDefault(word, 0) + 1); + } + } + this.latch.countDown(); + mapList.add(fileResults); + } + } + + public static void main(String[] args) throws FileNotFoundException, ExecutionException, InterruptedException { + List files = new ArrayList<>(); + files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\1.txt")); + files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\2.txt")); + files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\3.txt")); + files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\4.txt")); + files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\5.txt")); + files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\6.txt")); + Map results = MultiThreadWordCount3.count(5, files); + for (Map.Entry resultEntry : results.entrySet()) { + System.out.println("Key: " + resultEntry.getKey() + " Value: " + resultEntry.getValue()); + } + } } + From 692dac6a7e5c9c2e5a503b66699be89fcd32aebf Mon Sep 17 00:00:00 2001 From: pccmast Date: Tue, 8 Dec 2020 16:52:34 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=A4=9A=E7=BA=BF?= =?UTF-8?q?=E7=A8=8Bwordcount?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hcsp/multithread/MultiThreadWordCount1.java | 14 -------------- .../hcsp/multithread/MultiThreadWordCount2.java | 14 -------------- .../hcsp/multithread/MultiThreadWordCount3.java | 14 -------------- 3 files changed, 42 deletions(-) diff --git a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java index 2617eb4..6344a7f 100644 --- a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java +++ b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount1.java @@ -58,19 +58,5 @@ public Map call() throws Exception { return fileWords; } } - - public static void main(String[] args) throws FileNotFoundException, ExecutionException, InterruptedException { - List files = new ArrayList<>(); - files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\1.txt")); - files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\2.txt")); - files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\3.txt")); - files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\4.txt")); - files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\5.txt")); - files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\6.txt")); - Map results = MultiThreadWordCount1.count(5, files); - for (Map.Entry resultEntry : results.entrySet()) { - System.out.println("Key: " + resultEntry.getKey()+" Value: " + resultEntry.getValue()); - } - } } diff --git a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount2.java b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount2.java index d340965..b4ce401 100644 --- a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount2.java +++ b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount2.java @@ -69,18 +69,4 @@ private Map mergeTwoMap(Map subResult1, Map files = new ArrayList<>(); - files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\1.txt")); - files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\2.txt")); - files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\3.txt")); - files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\4.txt")); - files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\5.txt")); - files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\6.txt")); - Map results = MultiThreadWordCount2.count(5, files); - for (Map.Entry resultEntry : results.entrySet()) { - System.out.println("Key: " + resultEntry.getKey()+" Value: " + resultEntry.getValue()); - } - } } diff --git a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount3.java b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount3.java index 28b60e2..3ff5e8b 100644 --- a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount3.java +++ b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount3.java @@ -76,19 +76,5 @@ public void run() { mapList.add(fileResults); } } - - public static void main(String[] args) throws FileNotFoundException, ExecutionException, InterruptedException { - List files = new ArrayList<>(); - files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\1.txt")); - files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\2.txt")); - files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\3.txt")); - files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\4.txt")); - files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\5.txt")); - files.add(new File("D:\\project\\multithread-word-count\\src\\main\\java\\com\\github\\hcsp\\multithread\\6.txt")); - Map results = MultiThreadWordCount3.count(5, files); - for (Map.Entry resultEntry : results.entrySet()) { - System.out.println("Key: " + resultEntry.getKey() + " Value: " + resultEntry.getValue()); - } - } } From a74a9e693ca32905065ac3f6027b4c7118a93037 Mon Sep 17 00:00:00 2001 From: pccmast Date: Wed, 9 Dec 2020 17:58:31 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=A4=9A=E7=BA=BF?= =?UTF-8?q?=E7=A8=8Bwordcount?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/github/hcsp/multithread/1.txt | 3 --- src/main/java/com/github/hcsp/multithread/2.txt | 3 --- src/main/java/com/github/hcsp/multithread/3.txt | 3 --- src/main/java/com/github/hcsp/multithread/4.txt | 3 --- src/main/java/com/github/hcsp/multithread/5.txt | 3 --- src/main/java/com/github/hcsp/multithread/6.txt | 3 --- .../hcsp/multithread/MultiThreadWordCount2.java | 11 ++++++----- .../hcsp/multithread/MultiThreadWordCount3.java | 15 ++++++--------- 8 files changed, 12 insertions(+), 32 deletions(-) delete mode 100644 src/main/java/com/github/hcsp/multithread/1.txt delete mode 100644 src/main/java/com/github/hcsp/multithread/2.txt delete mode 100644 src/main/java/com/github/hcsp/multithread/3.txt delete mode 100644 src/main/java/com/github/hcsp/multithread/4.txt delete mode 100644 src/main/java/com/github/hcsp/multithread/5.txt delete mode 100644 src/main/java/com/github/hcsp/multithread/6.txt diff --git a/src/main/java/com/github/hcsp/multithread/1.txt b/src/main/java/com/github/hcsp/multithread/1.txt deleted file mode 100644 index ee98119..0000000 --- a/src/main/java/com/github/hcsp/multithread/1.txt +++ /dev/null @@ -1,3 +0,0 @@ -I am a teacher -I am a person -1 \ No newline at end of file diff --git a/src/main/java/com/github/hcsp/multithread/2.txt b/src/main/java/com/github/hcsp/multithread/2.txt deleted file mode 100644 index 1540a45..0000000 --- a/src/main/java/com/github/hcsp/multithread/2.txt +++ /dev/null @@ -1,3 +0,0 @@ -I am a teacher -I am a person -2 \ No newline at end of file diff --git a/src/main/java/com/github/hcsp/multithread/3.txt b/src/main/java/com/github/hcsp/multithread/3.txt deleted file mode 100644 index 2820c76..0000000 --- a/src/main/java/com/github/hcsp/multithread/3.txt +++ /dev/null @@ -1,3 +0,0 @@ -I am a teacher -I am a person -3 \ No newline at end of file diff --git a/src/main/java/com/github/hcsp/multithread/4.txt b/src/main/java/com/github/hcsp/multithread/4.txt deleted file mode 100644 index a08a52c..0000000 --- a/src/main/java/com/github/hcsp/multithread/4.txt +++ /dev/null @@ -1,3 +0,0 @@ -I am a teacher -I am a person -4 \ No newline at end of file diff --git a/src/main/java/com/github/hcsp/multithread/5.txt b/src/main/java/com/github/hcsp/multithread/5.txt deleted file mode 100644 index 705b9bd..0000000 --- a/src/main/java/com/github/hcsp/multithread/5.txt +++ /dev/null @@ -1,3 +0,0 @@ -I am a teacher -I am a person -5 \ No newline at end of file diff --git a/src/main/java/com/github/hcsp/multithread/6.txt b/src/main/java/com/github/hcsp/multithread/6.txt deleted file mode 100644 index 824c25f..0000000 --- a/src/main/java/com/github/hcsp/multithread/6.txt +++ /dev/null @@ -1,3 +0,0 @@ -I am a teacher -I am a person -6 \ No newline at end of file diff --git a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount2.java b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount2.java index b4ce401..d1721c6 100644 --- a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount2.java +++ b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount2.java @@ -1,7 +1,9 @@ package com.github.hcsp.multithread; -import java.io.*; -import java.util.ArrayList; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -15,8 +17,7 @@ public class MultiThreadWordCount2 { public static Map count(int threadNum, List files) { ForkJoinPool forkJoinPool = new ForkJoinPool(threadNum); ForkJoinTask> task = new readFileWordTask(files); - Map taskResults = forkJoinPool.invoke(task); - return taskResults; + return forkJoinPool.invoke(task); } public static class readFileWordTask extends RecursiveTask> { @@ -29,7 +30,7 @@ public readFileWordTask(List files) { @Override protected Map compute() { - if (files.size() <= 6) { + if (files.size() <= THRESHOLD) { Map results = new ConcurrentHashMap<>(); for (File file : files) { try { diff --git a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount3.java b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount3.java index 3ff5e8b..152570a 100644 --- a/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount3.java +++ b/src/main/java/com/github/hcsp/multithread/MultiThreadWordCount3.java @@ -1,19 +1,13 @@ package com.github.hcsp.multithread; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.ArrayList; +import java.io.*; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.CopyOnWriteArrayList; public class MultiThreadWordCount3 { @@ -63,10 +57,13 @@ public void run() { String line = null; while (true) { try { - if ((line = bufferedReader.readLine()) == null) break; + if ((line = bufferedReader.readLine()) == null) { + break; + } } catch (IOException e) { e.printStackTrace(); } + assert line != null; String[] words = line.split(" "); for (String word : words) { fileResults.put(word, fileResults.getOrDefault(word, 0) + 1);