Java process.getInputStream() 没有什么可读的,死锁 child

标签 java process deadlock inputstream

我遇到了一些进程包装问题,它只发生在 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。

最佳答案

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

关于Java process.getInputStream() 没有什么可读的,死锁 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3756899/

相关文章:

mysql - MySQL 上的死锁与锁等待超时

java - 使用 AOP 作用域代理在单例 bean 中 Autowiring 原型(prototype) bean

java - 使方法同步可以确保它是线程安全的吗?

面向初学者的 Java 挑战 : Generate random numbers in a while loop

c - 隐藏 Execve 的终端输出

c++ - 为什么我的 DCOM 客户端会锁定对 SendMessage 的调用?

c++ - 线程构建 block : Deadlocks because all threads used up

java错误不兼容的类型需要int找到double

ubuntu - 使用 gnuplot 绘制进程树

c# - 使用 WMI 的进程启动事件 - 并非检测到所有进程启动