Вот программа, которая пытается прочитать 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-й вывод печатает пробел перед 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
Что означает этот вывод?