2

ご支援ありがとうございます。

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.
}
4

1 に答える 1