Java WordCounter - PullRequest
       10

Java WordCounter

0 голосов
/ 05 декабря 2018

Здравствуйте, у меня есть проект для школы, в котором я должен создать программу на java, которая считает слова в одном или нескольких файлах.Должен начинаться новый поток для каждого нового файла.Предполагается также наличие замков для защиты объединенного счетчика слов и счетчика активных потоков.Я пытался исследовать замки, но у меня возникли проблемы с пониманием концепции.Вот то, что я смог придумать до сих пор.

public class Main {

    public static void main(String[] args)throws InterruptedException {

        WordCount[] counters = new WordCount[args.length];
        for (int index = 0; index < args.length; ++index)
            {
                counters[index] = new WordCount(args[index]);
                counters[index].start();
            }
        int total = 0;
        for (WordCount counter : counters)
        {
            counter.join();
            total += counter.count;
        }

        System.out.println("Total:" + total);

    }

}


public class WordCount extends Thread {

    int count;

    @Override
    public void run()
    {
        count = 0; //it will count the words
        ++count;

    }
}

1 Ответ

0 голосов
/ 05 декабря 2018

«Защита» счетчика слов на самом деле означает просто предотвращение попыток обновления счетчика слов одновременно двумя потоками.Самый простой способ добиться этого в Java - с помощью ключевого слова synchronized:

class WordCounter {
    private int count = 0;

    public synchronized void incrementCount() {
        count++;
    }
}

Теперь, если два потока вызывают этот метод, JVM заставит один ждать, пока другой не завершится.

Далее вам нужен метод, который будет считать слова в файле.Это должно быть относительно просто.Что-то вроде:

private void countWords(Path path) {
    for (String line : Files.readAllLines(path)) {
        for (String word : line.split("\\s+")) {
            counter.incrementCount();
        }
    }
}

Вам нужно будет справиться с исключениями ввода-вывода здесь.

Наконец, вам нужно создать поток для каждого файла.В данный момент вы создаете подкласс класса Thread, но более простое решение - просто создать поток с Runnable, который вам нужен для запуска потока:

for (Path path: myFiles) {
    Thread thread = new Thread(() -> counter.countWords(path));
    thread.run();
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...