Многопоточное приложение Java, которое читает один файл
В настоящее время я написал свою программу для использования 32 потоков и чтения 1 файла на поток (так что 32 файла .txt). Многопоточность не имеет ничего общего с скоростью процессора, но 32 вызова BING api в секунду намного быстрее, чем создание 1. Каждый из .txt файлов, содержащих список поисковых запросов. Я создаю поток, который он читает по одной строке за раз из файла. Можно ли создать все 32 потока и указать их в один .txt файл?
Ответы
Ответ 1
Используйте шаблон Продюсер-Потребитель. Имейте только один поток, который читает файл и подталкивает каждую строку/команду в ArrayBlockingQueue (потокобезопасное чтение и запись) с помощью put()
.
Все остальные 32 потока должны читать из одного и того же объекта очереди, вызывая take()
. Они будут блокироваться, если очередь пуста, что приятно.
Это решение лучше, потому что диск по своей сути является однопоточным, поэтому вы не получите многого, прочитав файл одновременно.
Ответ 2
Вы можете синхронизировать код, обрабатывающий файл. Каждый раз, когда вы пишете файл, который вы открываете, пишите и закрывайте его. Реализуйте использование монитора, и все должно быть хорошо.
Также можно использовать журнал использования java, поскольку он является потокобезопасным. Если вы реализуете обработчик, тогда регистрация api должна заботиться о проблемах безопасности потоков.
Ответ 3
Это зависит от того, как эти потоки реализованы. Если каждый из них имеет свой собственный считыватель или входной поток в файле, то параллельное чтение, вероятно, не является проблемой. Если реализация JVM на ОС неявно блокирует файл, когда входной поток открывается на нем, и блокировка не может быть разделена между потоками.
Но, если честно, вы будете делать много ненужной работы. Было бы гораздо лучше инкапсулировать доступ к файлу в отдельный класс и передать экземпляры этого в ваши потоки, а затем сделать этот класс необходимой обработкой concurrency.