如何在使用线程时安全地关闭流

时间:2012-11-19 14:43:46

标签: java stream

我有这个代码的线程:

public void run() {

try {
    fileProcessor = new FileProcessor();
    fileProcessor.process();
  } catch (RuntimeException e) {
    // ...
  } finally {
    if (fileProcessor != null) {
      fileProcessor.close();
    }
  }
}

方法fileProcessor.process();也运行一些新线程:

protected void process() {
    this.writer = new Writer();
    final MyClient client = new MyClient();
    client.start();
}

此代码有时会抛出异常

Caused by: java.io.IOException: Stream closed
        at sun.nio.cs.StreamEncoder.ensureOpen(StreamEncoder.java:26)
        at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:99)
        at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:116)
        at java.io.OutputStreamWriter.write(OutputStreamWriter.java:203)
        at java.io.Writer.write(Writer.java:140)
        at java.io.Writer.append(Writer.java:210) 

我怎样才能安全地关闭流?因为fileProcessor.close();现在可能关闭了这个流,但仍有一些线程使用它。

2 个答案:

答案 0 :(得分:1)

对fileProcessor中的所有线程使用thread.join()。所以它会等到所有线程完成任务。

client.start();
client.join(); // this will make sure client thread finished before proceed to next step

Link to simple tutorial on thread.join for clear understanding

答案 1 :(得分:0)

不要在process()方法中启动新线程,而是同步运行该功能。

或者,在您的close()方法中调用process()方法。