«Защита» счетчика слов на самом деле означает просто предотвращение попыток обновления счетчика слов одновременно двумя потоками.Самый простой способ добиться этого в 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();
}
Вот и все.Я не добавил код для подсчета количества запущенных потоков, но он действительно повторяет тот же шаблон.