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