ご支援ありがとうございます。
ProcessBuilder を使用して Java からバッチ ファイルを実行しています。この実行は、4 分ごとにスレッドで継続されます。出力とエラーが取得され、ファイルに書き込まれます。
これで1日か2日は大丈夫です。その後、実行中のスレッドがブロックされます。アプリケーションを再起動すると、さらに 1 ~ 2 日は問題なく動作します。私は過去20日間、何度もこの問題を抱えています。
分析してみました。エラーストリームからエラーは見つかりませんでした。ログファイルに出力された最後のステートメントまで、すべてが正しいです。スレッドダンプを取得して分析しました。スレッドの状態
"load-thr" prio=6 tid=0x0000000009875000 nid=0x1014 runnable [0x000000000c71e000] java.lang.Thread.State: RUNNABLE
- ロックされた <0x00000000894fbeb8> (a java.io.InputStreamReader) at java.io.BufferedReader.readLine(Unknown) Source)
at com.xxx.qqq.load(MyLoad.java:553) ==> これは while() ステートメントの行です
while() ステートメント行で無期限に待機するのはなぜですか?
このロックの原因は何ですか?
public void load()
{
BufferedReader br1=null,br2=null;
String err=null,err1=null;
Process p=null;
try
{
ProcessBuilder pb=new ProcessBuilder();
pb.directory("my work directory given");
pb.command("cmd.exe","/c","www.bat");
pb.redirectErrorStream(true);
p=pb.start();
br1=new BufferedReader(new InputStreamReader(p.getInputStream()));
br2=new BufferedReader(new InputStreamReader(p.getErrorStream()));
while((err=br1.readLine())!=null || (err1=br2.readLine())!=null) { if(err!=null) {logtofile(err);} if(err1!=null) {logtofile(err1);}}
p.waitFor();
}
catch(Exception e){e.printStackTrace();}
finally
{
try{
if(p!=null){p.destroy();}
if(br1!=null) {br1.close();}
if(br2!=null) {br2.close();}
}catch(Exception e) {
e.printStackTrace();
}
}
}
public void logtofile(String err){
//all statements are written to file.
//file 'll be changed over the time when file size exceeds 2MB.
}