views:

212

answers:

2

How to read from BufferedReader simultaneously by multiple threads.

+6  A: 

Well, you won't be able to have them actually simultaneously performing a read. However, you could:

  • Synchronize all the reads on one lock, so that only one thread tries to read at a time, but they can all read eventually
  • Have one thread just reading, and make it populate a thread-safe queue of some sort (see java.util.concurrent for various options) which the other threads fetch items from.

Are you wanting to read lines at a time, or arbitrary blocks of characters?

Jon Skeet
A: 

If all threads are to read all lines from the file, then you should create a separate buffered reader for each thread. If each thread is processing one line at a time (and the order of lines don't matter), then you should probably use the producer/consumer model, where only one thread actually reads from the file and places the workload in a BlockingQueue, while other threads periodically remove work loads and process them. Note that you will be able to redue locking overhead if you read N lines into a list, and then place the list in the blocking queue, instead of placing each individual line directly in the blocking queue, since that will allow multiple lines to be read/extracted with a single synchronization operation... placing and removing each and every line directly into/out of the queue will be very inefficient, especially if processing them is fairly quick.

Michael Aaron Safyan