Если один поток закрывает поток, а другой поток начинает читать из потока, я получаю «Исключение закрытого потока». Как решить проблему? - PullRequest
1 голос
/ 25 ноября 2011

У меня есть файл.Иногда случается, что один поток завершил чтение файла.В тот момент, когда он закрывает читатель, приходит другой поток и пытается прочитать из того же потока, который связан с читателем.Но потом я получаю

  stream already close exception.

Как я могу решить такие проблемы.

Как

new BufferedReader(new InputStreamReader(in));

Как я могу создать отдельный поток для разных потоков.

Ответы [ 3 ]

3 голосов
/ 25 ноября 2011

Не читать один и тот же поток из двух разных потоков.

Каждый поток должен иметь свой собственный поток, и каждый из них закрывает поток по завершении. Это позволяет каждому потоку управлять потоком в своем собственном потоке. Несколько потоков, пытающихся читать из одного потока, просто напрашиваются на неприятности.

1 голос
/ 25 ноября 2011

Ну, по моему мнению, вы не должны закрывать поток, когда поток завершил свою работу.Просто оставьте его открытым и закройте, когда вся работа сделана.

Конечно, поскольку вы используете один и тот же поток, вам необходимо синхронизировать доступ к потоку для предотвращения конфликтов.Вам просто нужно использовать объект в качестве монитора.Например:

synchronized(monitor) {
    monitor.wait();   // wait for signal
}

// read from input stream

synchronized(monitor) {
    monitor.notify(); // release the next thread to start reading
}

Каждый поток будет запускать этот код.Затем основной поток вызовет уведомление для первого потока, чтобы он мог прочитать, а затем, если вы запустите другие потоки, они будут ждать завершения предыдущего.

Обратите внимание, что здесь я предполагаю, что вы этого не делаетехочу читать из файла параллельно.

0 голосов
/ 25 ноября 2011

Если вы запустите это в более чем одном потоке, он создаст один для каждого потока.

BufferedReader br = new BufferedReader(new FileReader(file));
// do some reading
br.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...