【发布时间】:2011-04-14 23:43:13
【问题描述】:
我遇到了一些进程包装问题,它只发生在 Windows XP 中。这段代码在 Windows 7 中完美运行。我真的很困惑为什么 XP 中的流是空的。我也尝试过使用 Process.Exec() 的 String[] 版本,它没有任何区别。
我正在使用以下类来读取进程的 STDOUT 和 STDERR(每个流的实例):
import java.util.*;
import java.io.*;
public class ThreadedStreamReader extends Thread{
InputStream in;
Queue messageQueue;
public ThreadedStreamReader(InputStream s, Queue q)
{
in = s;
messageQueue = q;
}
public void run()
{
try
{
BufferedReader r = new BufferedReader(new InputStreamReader(in));
String line = null;
while((line = r.readLine()) != null)
{
synchronized(messageQueue)
{
messageQueue.add(line);
}
}
}catch(Exception e)
{
System.err.println("Bad things happened while reading from a stream");
}
}
}
我在这里使用它:
Process p = Runtime.getRuntime().exec("test.exe");
Queue<String> q = new LinkedList<String>();
ThreadedStreamReader stdout = new ThreadedStreamReader(p.getInputStream(), q);
ThreadedStreamReader stderr = new ThreadedStreamReader(p.getErrorStream(), q);
stdout.start();
stderr.start();
while(true)
{
while(q.size() > 0)
{
System.out.println(q.remove());
}
}
有人有什么想法吗?谢谢!
编辑:添加同步
编辑:就像更新一样,父流读取器的读取操作被阻止。如果我使用任务管理器杀死子进程,它们会从流的关闭中读取 null。
【问题讨论】:
-
+1 提出了一个很好的详细问题,表明您已经考虑了这里可能出现的潜在问题。
-
坐在这里上网搜索答案后,我偶然发现了这个问题。我还没有找到解决方案,只有一种解决方法,但至少我已经启动并运行了。我传递给程序的参数之一导致它挂起。我取出了参数,这对于我正在尝试做的事情并不是最佳的,但程序不再挂起。同样的参数也适用于我的 Win7 机器,所以我什至不认为这是其中的一部分。哦,好的,谢谢你的帮助!
-
你删除了什么样的参数?我在 Java 中遇到了一些奇怪而愚蠢的死锁问题(都有一个共同点:从 System.in 中读取)
标签: java process deadlock inputstream