1

私はこのコードでスレッドを持っています:

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();このストリームを閉じますが、それを使用するスレッドがまだいくつかあるからです。

4

2 に答える 2

1

thread.join()fileProcessor のすべてのスレッドに使用します。すべてのスレッドがタスクを完了するまで待機するようにします。

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

明確な理解のために、thread.join に関する簡単なチュートリアルへのリンク

于 2012-11-19T15:11:54.240 に答える
0

メソッドで新しいスレッドを開始しないでくださいprocess()。代わりに、機能を同期的に実行してください。

close()または、メソッド内からメソッドを呼び出しますprocess()

于 2012-11-19T15:05:18.757 に答える