Многопоточное приложение Java, которое читает один файл

В настоящее время я написал свою программу для использования 32 потоков и чтения 1 файла на поток (так что 32 файла .txt). Многопоточность не имеет ничего общего с скоростью процессора, но 32 вызова BING api в секунду намного быстрее, чем создание 1. Каждый из .txt файлов, содержащих список поисковых запросов. Я создаю поток, который он читает по одной строке за раз из файла. Можно ли создать все 32 потока и указать их в один .txt файл?

Ответ 1

Используйте шаблон Продюсер-Потребитель. Имейте только один поток, который читает файл и подталкивает каждую строку/команду в ArrayBlockingQueue (потокобезопасное чтение и запись) с помощью put().

Все остальные 32 потока должны читать из одного и того же объекта очереди, вызывая take(). Они будут блокироваться, если очередь пуста, что приятно.

Это решение лучше, потому что диск по своей сути является однопоточным, поэтому вы не получите многого, прочитав файл одновременно.

Ответ 2

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

Также можно использовать журнал использования java, поскольку он является потокобезопасным. Если вы реализуете обработчик, тогда регистрация api должна заботиться о проблемах безопасности потоков.

Ответ 3

Это зависит от того, как эти потоки реализованы. Если каждый из них имеет свой собственный считыватель или входной поток в файле, то параллельное чтение, вероятно, не является проблемой. Если реализация JVM на ОС неявно блокирует файл, когда входной поток открывается на нем, и блокировка не может быть разделена между потоками.

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