почему 2 ссылки BufferedReader не функционируют здесь независимо? - PullRequest
1 голос
/ 20 августа 2011

Вот программа, которая пытается прочитать 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

Что означает этот вывод?

1 Ответ

4 голосов
/ 20 августа 2011

Две ссылки ссылаются на один и тот же экземпляр BufferedReader.

Поэтому, если один поток читает что-то, следующий или тот же поток продолжает читать с последней позиции.

Во втором примере вы создаете два разных считывателя с разными внутренними состояниями (позиция чтения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...