tutorialspoint thread que multithread multi manage implement español java multithreading process-management

que - thread java tutorialspoint



Drenaje del error estándar en Java (2)

Establezca la propiedad redirectErrorStream en ProcessBuilder para enviar salida de stderr a stdout:

ProcessBuilder builder = new ProcessBuilder(command); builder.redirectErrorStream(true);

A continuación, debe crear un hilo para tratar la secuencia de proceso, algo como lo siguiente:

Process p = builder.start(); InputHandler outHandler = new InputHandler(p.getInputStream());

Donde InputHandler se define como:

private static class InputHandler extends Thread { private final InputStream is; private final ByteArrayOutputStream os; public InputHandler(InputStream input) { this.is = input; this.os = new ByteArrayOutputStream(); } public void run() { try { int c; while ((c = is.read()) != -1) { os.write(c); } } catch (Throwable t) { throw new IllegalStateException(t); } } public String getOutput() { try { os.flush(); } catch (Throwable t) { throw new IllegalStateException(t); } return os.toString(); } }

Alternativamente, solo crea dos InputHandlers para InputStream y ErrorStream. Saber que el programa se bloqueará si no los lees es el 90% de la batalla :)

Al iniciar un proceso desde Java, tanto stderr como stdout pueden bloquearse en la salida si no leo desde las canalizaciones. Actualmente tengo un hilo que lee proactivamente de uno y los bloques de hilos principales del otro.

¿Existe una manera fácil de unir las dos corrientes o hacer que el subproceso continúe sin perder los datos en stderr?


Solo tiene dos hilos, uno leyendo de stdout, uno de stderr.