Если все потоки должны прочитать все строки из файла, то вы должны создать отдельную буферизованную программу чтения для каждого потока. Если каждый поток обрабатывает по одной строке за раз (и порядок строк не имеет значения), то вам, вероятно, следует использовать модель производителя / потребителя, где только один поток фактически читает из файла и помещает рабочую нагрузку в * 1001. * BlockingQueue , в то время как другие потоки периодически снимают рабочие нагрузки и обрабатывают их. Обратите внимание, что вы сможете уменьшить накладные расходы на блокировку, если прочитаете N строк в список, а затем поместите список в очередь блокировки, вместо того, чтобы помещать каждую отдельную строку непосредственно в очередь блокировки, поскольку это позволит читать несколько строк. / извлечено с помощью одной операции синхронизации ... размещение и удаление каждой строки непосредственно в / из очереди будет очень неэффективным, особенно если их обработка выполняется довольно быстро.