Java process.getInputStream()没什么可读的,死锁是孩子

Ban*_*ana 9 java deadlock inputstream process

我遇到了一些进程包装的问题,它只发生在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");
  }
 }
}
Run Code Online (Sandbox Code Playgroud)

我在这里使用它:


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());
    }
}
Run Code Online (Sandbox Code Playgroud)

有人有主意吗?谢谢!

编辑:添加同步

编辑:就像更新一样,父流读取器在读取操作时被阻止.如果我使用任务管理器杀死子进程,则它们会从流的关闭中读取null.

Jas*_*n S 1

你需要使用线程安全的数据结构;我不认为 LinkedList 是线程安全的。