上午,美國的QA報告了一個的異常:
Caused by: java.io.IOException: Stream closed at java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:134) at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) at java.io.BufferedInputStream.read(BufferedInputStream.java:235) at ........ |
這個異常發生在從某一個input stream流讀取資訊的時候發生的。在我們目前的系統中出現這個異常是比較不正常,特別是這個異常並不是很容易重現。我和本地的QA都沒有重現出來。
雖然不能重現bug,但是憑藉經驗來說,這個異常是發生在這樣一種情境之下:多個線程索引同一個input stream,當某一個thread在執行完之後,把這個inputstream關閉了;而此時正在從這個input stream流中讀取資訊的線程就會拋出 java.io.IOException: Stream closed 異常。
我寫了一小段測試程式,類比這個情境,如下:
public class IOTest ...{
public static void main(String[] args) ...{
File f = new File("c:/test/StoreTest-1.xml");
java.io.BufferedReader br = null;
try ...{
br = new java.io.BufferedReader(new java.io.FileReader(f));
} catch (FileNotFoundException e) ...{}
final java.io.BufferedReader br1 = br;
final java.io.BufferedReader br2 = br;
Thread t = new Thread() ...{
public void run() ...{
try ...{
for (String line = null; (line = br1.readLine()) != null;) ...{
System.out.println("Process stdout: " );
try ...{
Thread.sleep(1000);
} catch (InterruptedException e) ...{}
}
} catch (IOException ioe) ...{
ioe.printStackTrace();
}
}
};
Thread t2 = new Thread() ...{
public void run() ...{
try ...{
for (String line = null; (line = br2.readLine()) != null;) ...{}
System.out.println("Process stdout2: ");
br2.close();
} catch (IOException ioe) ...{
ioe.printStackTrace();
}
}
};
t.start();
t2.start();
}
}
當執行這段程式之後,會看到如下輸出:
Process stdout:
Process stdout2:
java.io.IOException: Stream closed
at java.io.BufferedReader.ensureOpen(BufferedReader.java:97)
at java.io.BufferedReader.readLine(BufferedReader.java:293)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at test.common.util.IOTest$1.run(IOTest.java:38)