我有这个代码的线程:
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();
现在可能关闭了这个流,但仍有一些线程使用它。
答案 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()
方法。