Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不';BufferedReader函数的两个引用在这里是独立的吗?_Java_Multithreading_Bufferedreader - Fatal编程技术网

Java 为什么不';BufferedReader函数的两个引用在这里是独立的吗?

Java 为什么不';BufferedReader函数的两个引用在这里是独立的吗?,java,multithreading,bufferedreader,Java,Multithreading,Bufferedreader,这是一个试图从文件中读取两个句子的程序。出于某种原因,程序尝试从新线程读取。在启动新线程之前,我初始化BufferedReader对象,并将其作为引用传递给启动线程的函数。现在我有两个BufferedReader对象的引用,我尝试从主线程和创建的新线程中读取句子 在文件中,新行上的两个句子是: D:\UnderTest\wavtester_1.wav D:\UnderTest\wavtester_2.wav 与此相反,如果在方法fnctni中初始化一个新的BufferedReader对象

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

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

D:\UnderTest\wavtester_1.wav D:\UnderTest\wavtester_2.wav 与此相反,如果在方法
fnctn
i中初始化一个新的
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 从主线程D:\UnderTest\wavetester\u 1.wav 从主线程D:\UnderTest\wavetester\u 2.wav 从主线 在新线程D:\UnderTest\wavetester\u 1.wav上 在新线程D:\UnderTest\wavetester\u 2.wav上 新思路
此输出指示什么?

这两个引用引用了BufferedReader的同一个实例

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


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

这两个引用引用了BufferedReader的同一个实例

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

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

另外(为了帮助回答问题),当您调用
start()
start()
)时,另一个线程不一定“启动”(
start()
只是启动)。这就是为什么主线程读取第一行,尽管另一个线程看起来应该首先开始。事实上,老实说,我更惊讶的是,
BufferedReader
没有在两个线程中被调用而崩溃和烧坏(我很确定它不是线程安全的)。如果作者读了更多的行,它可能已经崩溃了……而且(为了帮助回答这个问题),当你调用
start()
start()
)时,另一个线程不一定是“开始”的。这就是为什么主线程读取第一行,尽管另一个线程看起来应该首先开始。事实上,老实说,我更惊讶的是,
BufferedReader
没有在两个线程中被调用而崩溃和烧坏(我很确定它不是线程安全的)。如果作者读了更多的台词,它可能会崩溃。。。
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 );
      }
   }
}
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