2

感谢您的支持。

我正在使用 ProcessBuilder 从 java 执行批处理文件。此执行将在一个线程中每 4 分钟继续执行一次。输出和错误将被写入文件。

这可以正常工作 1 或 2 天。之后,执行线程被阻塞。我将重新启动应用程序,它可以再正常工作 1 或 2 天。在过去的 20 天里,我一次又一次地遇到这个问题。

我试着分析。我没有从错误流中发现任何错误。直到日志文件中打印的最后一条语句,一切都正确。我拿了线程转储并进行了分析。线程状态

“load-thr”prio=6 tid=0x0000000009875000 nid=0x1014 可运行 [0x000000000c71e000] java.lang.Thread.State: RUNNABLE
- 锁定 <0x00000000894fbeb8> (a java.io.InputStreamReader) 在 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

0

这个问题已经在这里回答了 。基本上你应该在另一个线程中阅读你的流。因为从流中读取会阻塞调用,直到某些输入可用、发生 I/O 错误或到达流的末尾。

于 2013-07-19T04:32:34.357 回答