Многопоточный файл Java: чтение + операция + запись

Я пытаюсь написать небольшую программу для решения следующих проблем с использованием многопоточности в java. Я изо всех сил пытаюсь понять, с чего начать, и ищу совета. Желаемые шаги в этом процессе следующие:

  1. Прочитать все текстовые файлы, содержащиеся в данном каталоге
  2. Создайте счетчик слов для каждого прочитанного файла.
  3. Запишите количество слов как результат в новый файл в другом каталоге.

Я написал функцию wordcount, и она отлично работает, но хотел бы узнать больше о том, как выполнить эту операцию в многопоточном режиме, чтобы файлы считывались, слова подсчитывались, а затем вывод был записан параллельно.

Возможно использование функции Stream в Java (docs.oracle.com/javase/tutorial/collections/streams/…). Создайте список файлов, содержащихся в каталоге, и получите parallelStream этих файловых объектов. Затем вы можете обработать каждый файл, возвращая счетчик слов как часть обработки параллельного потока. Затем вы можете выяснить, что делать со счетчиком ... если каждый из них записан в свой собственный файл, это тоже может быть частью обработки потока. Я бы начал там

EdH 16.11.2018 23:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
74
2

Ответы 2

Можете ли вы поделиться однопоточной версией? Концептуально это может быть так просто (псевдо-код Java). countWords и writeOutput - ваши методы и files - это список файлов, которые вы уже прочитали.

files.parallelStream()
    .map(file -> new Pair(file, countWords(file)))
    .forEach((file, count) -> writeOutput(file, count));

Мне нравится ваш энтузиазм в изучении многопоточного программирования!
Помимо параллельной задачи между файлами, вы также можете распараллелить и оптимизировать фактическую задачу countWords.

Это классический случай использования Fork / Join. Довольно продвинутый уровень многопоточного программирования, но очень приятный :)

вы можете поискать в Интернете примеры, похожие на ваш собственный, вот один для начала: https://www.baeldung.com/java-fork-join

Другие вопросы по теме