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