java - 使用线程时如何安全关闭流

标签 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(); 现在我可能关闭这个流,但仍然有一些线程使用它。

最佳答案

对 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

关于java - 使用线程时如何安全关闭流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13456094/

相关文章:

c# - .Net SslStream 写/读问题

ios - grpc iOS 流,仅在 GRXWriter.state 启动时发送?

c# - WebReponse.GetStream 的奇怪行为

java - GlazedLists AutoCompleteSupport 和搜索自定义对象

java - 我什么时候应该关闭实体管理器?

java 。是否有任何谷歌的 Guava 界面可以取代 Map<String, Map<String, String>>?

c# - 创建词流的最佳方式

java - post方法中相同类型的多个模型属性

java - 异步 api 的 CPU 利用率非常高

android - 在 android 中读取原始音频并提取 SMPTE 时间码