Синхронизация потоков java [закрыт]

134
05 ноября 2019, 18:10

Как сделать так чтобы программа собирала статистику использования слов с нескольких файлов в параллельных потоках. Проверить каким образом размер, количество файлов и количество потоков влияют на быстродействие.

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();
        }
    }
}
Answer 1

Во-первых, где вы в этом коде вообще видите многопоточность? Во-вторых, судя по коду, в многопоточность вам пока рановато(это мягко говоря). Давайте для начала сделаем из этого кода что-то адекватное и рабочее, а уже потом посмотрим в сторону многопоточности. Для начала остановимся на статистике слов с одного файла. В написаный ниже метод передаем имя файла, используем функционалку, поскольку она подходит под задачу достаточно неплохо, довольно просто получаем коллекцию, в которой ключ - слово, а значение - сколько раз это слово встречается в файле. Сама функционалка внутри позволяет безопасно распаралелить поток. Кроме того, данный метод вы можете вызывать для каждого из своих файлов в одном потоке (т.е. количество файлов равно количеству потоков для чтения). Все просто и нет конкурентных ресурсов в принципе. Удачи...

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()));
        }
    }
READ ALSO
TableView как выделять ячейку а не всю строку

TableView как выделять ячейку а не всю строку

Как в JavaFX TableView щелкая по ячейке выделять отдельно каждую ячейку, а не всю строкуВ дальнейшем я бы хотел реализовать копирование содержимого...

156
Проблемы с кодировкой (Spring-MVC PDF)

Проблемы с кодировкой (Spring-MVC PDF)

Нужно было вывести PDF файл в Spring MVCСейчас при выводе кириллица не отображается,просто исчезает а цифры остаются

114
Как настроить notepad++ для компиляции кода java

Как настроить notepad++ для компиляции кода java

Решил покодить по хардкору использовав обычный текстовый редактор, но возникла загвоздка в его настройке, кто может описать шаги для настройки...

149