如果一个线程关闭流并且另一个线程开始从流中读取,则得到“Stream closed exception”。如何解决这个问题?

时间:2011-11-25 15:24:44

标签: java multithreading file filereader

我有一个档案。有时会发生一个线程读取文件的情况。当他关闭阅读器时,另一个线程出现并尝试从与阅读器关联的相同流中读取。但后来我得到了一些

  stream already close exception.

我如何解决这些问题。

new BufferedReader(new InputStreamReader(in));

我如何为不同的线程创建seprate流。

3 个答案:

答案 0 :(得分:3)

不要从两个不同的线程中读取相同的流。

每个线程都应该有自己的流,并且每个线程在完成后关闭流。这允许每个线程在自己的线程中管理流。尝试从同一个流读取的多个线程只是在寻找麻烦。

答案 1 :(得分:1)

嗯,我认为你不应该在线程完成工作时关闭流。只需将其打开并在完成所有工作后关闭它。

当然,由于您使用的是同一个流,因此需要同步对流的访问以防止冲突。您只需要将对象用作监视器。像:

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

// read from input stream

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

每个线程都将运行此代码。然后主线程将为第一个线程调用notify以允许它读取,然后如果你启动其他线程,它们将等待前一个线程完成。

请注意,这里我假设您不想并行读取文件。

答案 2 :(得分:0)

如果你在多个线程中运行它,它将为每个线程创建一个。

BufferedReader br = new BufferedReader(new FileReader(file));
// do some reading
br.close();