У меня проблема с некоторыми процессами, и это происходит только в Windows XP.Этот код прекрасно работает в Windows 7. Я действительно озадачен тем, почему потоки пусты в XP.Я также пытался использовать String [] версию Process.Exec (), и это не имело никакого значения.
Я использую следующий класс для чтения из процесса '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());
}
}
У кого-нибудь есть какие-нибудь идеи?Спасибо!
Редактировать: добавлена синхронизация
Редактировать: Так же, как и обновление, читатели родительского потока блокируются при выполнении операции чтения.Если я убиваю дочерние процессы с помощью диспетчера задач, они читают ноль с момента закрытия потока.