这是一个尝试从文件中读取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
此输出表示什么?
答案 0 :(得分:4)
这两个引用引用了BufferedReader的相同实例。
因此,如果一个线程读取某个内容,则下一个或同一个线程继续从最后一个位置读取。
在第二个示例中,您将创建两个具有不同内部状态(读取位置)的不同阅读器。