Как сделать так чтобы программа собирала статистику использования слов с нескольких файлов в параллельных потоках. Проверить каким образом размер, количество файлов и количество потоков влияют на быстродействие.
package com.company;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
public class Task1 {
public static void main(String[] args) {
System.out.println(frequentWords("C:\\Users\\Екатерина\\IdeaProjects\\lab2_3\\src\\com\\company\\1.txt"));
}
public Task1() {
}
public void start() {
System.out.println(this.frequentWords("C:\\Users\\Екатерина\\IdeaProjects\\lab2_3\\src\\com\\company\\1.txt"));
}
public static String frequentWords(String filename) {
HashMap wordsCount = new HashMap();
try {
BufferedReader e = new BufferedReader(new FileReader(filename));
Throwable var4 = null;
String var25;
try {
String str;
String s;
while((str = e.readLine()) != null) {
String[] frequency = str.split("\\s+");
int mostFrequent = frequency.length;
for(int var8 = 0; var8 < mostFrequent; ++var8) {
s = frequency[var8];
if(!wordsCount.containsKey(s)) {
wordsCount.put(s, Integer.valueOf(1));
} else {
wordsCount.put(s, Integer.valueOf(((Integer)wordsCount.get(s)).intValue() + 1));
}
}
}
int var22 = 0;
String var23 = null;
Iterator var24 = wordsCount.keySet().iterator();
while(var24.hasNext()) {
s = (String)var24.next();
int i = ((Integer)wordsCount.get(s)).intValue();
if(var22 == 0) {
var22 = i;
var23 = s;
}
if(i > var22) {
var22 = i;
var23 = s;
}
}
var25 = "The word " + var23 + " occurred " + var22 + " times";
} catch (Throwable var19) {
var4 = var19;
throw var19;
} finally {
if(e != null) {
if(var4 != null) {
try {
e.close();
} catch (Throwable var18) {
var4.addSuppressed(var18);
}
} else {
e.close();
}
}
}
return var25;
} catch (IOException var21) {
return var21.getMessage();
}
}
}
Во-первых, где вы в этом коде вообще видите многопоточность? Во-вторых, судя по коду, в многопоточность вам пока рановато(это мягко говоря). Давайте для начала сделаем из этого кода что-то адекватное и рабочее, а уже потом посмотрим в сторону многопоточности. Для начала остановимся на статистике слов с одного файла. В написаный ниже метод передаем имя файла, используем функционалку, поскольку она подходит под задачу достаточно неплохо, довольно просто получаем коллекцию, в которой ключ - слово, а значение - сколько раз это слово встречается в файле. Сама функционалка внутри позволяет безопасно распаралелить поток. Кроме того, данный метод вы можете вызывать для каждого из своих файлов в одном потоке (т.е. количество файлов равно количеству потоков для чтения). Все просто и нет конкурентных ресурсов в принципе. Удачи...
public Map<String, Long> frequentWords(final String fileName) throws IOException {
try (Stream<String> stream = Files.lines(Paths.get(fileName), Charset.defaultCharset())) {
return stream
.parallel()
.map(m -> m.toLowerCase().replaceAll("\\p{P}", "").split(" "))
.flatMap(m -> Arrays.stream(m))
.collect(groupingBy(Function.identity(), counting()));
}
}
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Как в JavaFX TableView щелкая по ячейке выделять отдельно каждую ячейку, а не всю строкуВ дальнейшем я бы хотел реализовать копирование содержимого...
Нужно было вывести PDF файл в Spring MVCСейчас при выводе кириллица не отображается,просто исчезает а цифры остаются
Решил покодить по хардкору использовав обычный текстовый редактор, но возникла загвоздка в его настройке, кто может описать шаги для настройки...