Tengo un problema con algunos procesos de ajuste, y solo ocurre en Windows XP. Este código funciona perfectamente en Windows 7. Estoy realmente perplejo sobre por qué las transmisiones están vacías en XP. También intenté usar la versión String [] de Process.Exec() y no importó nada.Java process.getInputStream() no tiene nada que leer, deadlocks child
estoy usando la siguiente clase para leer desde el proceso de stdout y stderr (una instancia para cada flujo):
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");
}
}
}
y lo uso aquí:
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());
}
}
Alguien tiene alguna ideas? ¡Gracias!
Editar: Se ha añadido la sincronización
edición: Del mismo modo que una actualización, los lectores de flujo padres están bloqueados en su operación de lectura. Si elimino los procesos hijos, con el administrador de tareas, ellos leen el nulo desde el cierre de la transmisión.
+1 por tener una buena pregunta detallada que demuestre que ha pensado en los posibles problemas que podrían surgir aquí. –
Después de sentarme aquí revisando las respuestas por Internet, me encontré al azar con el problema. No he resuelto la solución, solo una solución alternativa, pero al menos estoy en funcionamiento. Uno de los parámetros que estaba pasando al programa lo colgó. Saqué el parámetro, que no era óptimo para lo que estoy tratando de hacer, pero el programa ya no cuelga. Ese mismo parámetro funcionó en mi caja Win7, así que ni siquiera pensé que era parte de eso. Oh, bueno, gracias por la ayuda! – Banana
¿Qué tipo de parámetro eliminaste? Tuve algunos problemas extraños y tontos con interbloqueos en Java (todos tenían algo en común: lectura de System.in) –