为什么BufferedReader的2个引用在这里不能独立运行?

时间:2011-08-20 09:01:57

标签: java multithreading bufferedreader

这是一个尝试从文件中读取2个句子的程序。由于某种原因,程序尝试从新线程读取。在开始新线程之前,我初始化BufferedReader对象并将其作为对启动线程的函数的引用传递。现在我有2个BufferedReader对象的引用,我尝试从主线程和创建的新线程中读取句子。

在文件中,新行上的2个句子是:

    D:\UnderTest\wavtester_1.wav
    D:\UnderTest\wavtester_2.wav

但输出结果令人惊讶:

    FROM THE MAIN THREAD D:\UnderTest\wavtester_1.wav
    ON A NEW THREAD D:\UnderTest\wavtester_2.wav
    FROM THE MAIN THREAD

如果我们注意到,新线程没有读取第一个句子,并且主线程已经读取了第一个句子。当第3个语句被新线程读取时,第3个输出也会在FROM THE MAIN THREAD前面打印空白区域。那么,我应该解释这2个引用实际上是一个吗?

如果我错了那么实际发生了什么?

import java.io.*;

class tester {
   public static void main( String args[] ) {
      try {
         BufferedReader bfr = new BufferedReader( new FileReader( new File( "e:\\AVS Player\\AudioPlaylists\\tester.txt") ) );
         // pass a reference of bfr and start a new thread
         startThread( bfr );
         String y = null;
         while( ( y = bfr.readLine() ) != null ) {
            System.out.println("FROM THE MAIN THREAD" + " " + y );
         }    
      } catch( Exception exc ) {
         System.out.println( exc );
      } 
   }   

   private static void startThread( final BufferedReader bfr ) {
      Runnable r = new Runnable() {
         @Override
         public void run() {
            fnctn( bfr );
         }
      };
      new Thread(r).start();
   }

   private static void fnctn( BufferedReader bfr ) {
      String x = null;
      try {
         //BufferedReader bfr1 = new BufferedReader( new FileReader( new File( "e:\\AVS Player\\AudioPlaylists\\tester.txt") ) );
         while( ( x = bfr.readLine() ) != null ) {
            System.out.println("ON A NEW THREAD" + " " + x);
         }
      } catch( Exception exc ) {
         System.out.println( exc );
      }
   }
}

与此相反,如果在方法fnctn中我初始化一个新的BufferedReader对象并从该引用中读取输出:

    FROM THE MAIN THREAD D:\UnderTest\wavtester_1.wav
    FROM THE MAIN THREAD D:\UnderTest\wavtester_2.wav
    FROM THE MAIN THREAD
    ON A NEW THREAD D:\UnderTest\wavtester_1.wav
    ON A NEW THREAD D:\UnderTest\wavtester_2.wav
    ON A NEW THREAD

此输出表示什么?

1 个答案:

答案 0 :(得分:4)

这两个引用引用了BufferedReader的相同实例。

因此,如果一个线程读取某个内容,则下一个或同一个线程继续从最后一个位置读取。

在第二个示例中,您将创建两个具有不同内部状态(读取位置)的不同阅读器。