感谢您的支持。
我正在使用 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.
}