title: How to read files in multithreaded mode?
body: <p>I currently have a program that reads file (very huge) in single threaded mode and creates search index but it takes too long to index in single threaded environment.</p>
  
  <p>Now I am trying to make it work in multithreaded mode but not sure the best way to achieve that.</p>
  
  <p>My main program creates a buffered reader and passes the instance to thread and the thread uses the buffered reader instance to read the files. </p>
  
  <p>I don't think this works as expected rather each thread is reading the same line again and again.</p>
  
  <p>Is there a way to make the threads read only the lines that are not read by other thread? Do I need to split the file? Is there a way to implement this without splitting the file?</p>
  
  <p><strong>Sample Main program:</strong></p>
  
  <pre><code>import java.io.BufferedReader;
  import java.io.FileNotFoundException;
  import java.io.FileReader;
  import java.util.ArrayList;
  
  public class TestMTFile {
      public static void main(String args[]) {
          BufferedReader reader = null;
          ArrayList&lt;Thread&gt; threads = new ArrayList&lt;Thread&gt;();
          try {
              reader = new BufferedReader(new FileReader(
                      "test.tsv"));
          } catch (FileNotFoundException e1) {
              e1.printStackTrace();
          }
          for (int i = 0; i &lt;= 10; i++) {
              Runnable task = new ReadFileMT(reader);
              Thread worker = new Thread(task);
              // We can set the name of the thread
              worker.setName(String.valueOf(i));
              // Start the thread, never call method run() direct
              worker.start();
              // Remember the thread for later usage
              threads.add(worker);
          }
  
          int running = 0;
          int runner1 = 0;
          int runner2 = 0;
          do {
              running = 0;
              for (Thread thread : threads) {
                  if (thread.isAlive()) {
                      runner1 = running++;
                  }
              }
              if (runner2 != runner1) {
                  runner2 = runner1;
                  System.out.println("We have " + runner2 + " running threads. ");
  
              }
          } while (running &gt; 0);
  
          if (running == 0) {
              System.out.println("Ended");
          }
      }
  }
  </code></pre>
  
  <p><strong>Thread:</strong></p>
  
  <pre><code>import java.io.BufferedReader;
  import java.io.IOException;
  
  public class ReadFileMT implements Runnable {
      BufferedReader bReader = null;
  
      ReadFileMT(BufferedReader reader) {
          this.bReader = reader;
      }
  
      public synchronized void run() {
          String line;
          try {
              while ((line = bReader.readLine()) != null) {
  
                  try {
                      System.out.println(line);
                  } catch (Exception e) {
  
                  }
              }
          } catch (IOException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }
      }
  }
  </code></pre>