Tenemos el hallazgo a esta duda, o por lo menos eso pensamos. Si tienes inquietudes dínoslo, para nosotros será un placer responderte
Solución:
Si su proceso externo espera algo en su stdin
DEBE cerrar el getOutputStream
. De lo contrario, lo harás waitFor
para siempre.
Aquí está el artículo Cuando Runtime.exec() no lo hará de JavaWorld que describe las diferentes trampas del método exec y cómo evitarlas.
Desde mi experiencia, es mejor consumir STDOUT y STDERR del proceso secundario (hasta que EOF) y luego bloquear waitFor
. Con suerte, llegados a este punto, no tendrá que esperar mucho tiempo.
Una respuesta a la pregunta de Kaleb. Sin embargo, en condiciones normales, no debe cerrar las transmisiones porque está waitingFor
y por alguna razón no tiene un tiempo de espera, es posible que deba cerrar estas transmisiones si encuentra algunas condiciones de error en la salida y no desea procesar más la salida del niño. Sin embargo, si el programa secundario terminará (bloqueará) cuando su tubería STDOUT o STDERR esté cerrada en el otro extremo depende totalmente de la implementación de ese hijo. Sin embargo, la mayoría de los programas shell terminarán bajo tales condiciones.
Yo realmente deseo waitFor
Sin embargo, tuvo un tiempo de espera significativo y el Process
tenía una forma documentada de limpiar sus recursos cuando decidiste abandonar su monitoreo.
Creo que esto es un poco contrario a la intuición, pero:
getOutputStream Obtiene el flujo de salida del subproceso. La salida al flujo se canaliza al flujo de entrada estándar del proceso representado por este objeto Process. Nota de implementación: es una buena idea almacenar en búfer el flujo de salida. Devuelve: el flujo de salida conectado a la entrada normal del subproceso.
Lo leí como este flujo de salida del proceso principal y está adjunto a la entrada estándar del subproceso, por lo que cuando escribe en getOutputStream().write(), en realidad está escribiendo en la entrada estándar.
¿Es posible que desee utilizar .getInputStream()?
Devuelve: el flujo de entrada conectado a la salida normal del subproceso.
En cuanto a Process.Waitfor(), los documentos de la API dicen:
hace que el subproceso actual espere, si es necesario, hasta que el proceso representado por este objeto Process haya terminado. Este método regresa inmediatamente si el subproceso ya ha terminado. Si el subproceso aún no ha terminado, el subproceso de llamada se bloqueará hasta que finalice el subproceso.
Diría que el subproceso en el que se llama se bloqueará hasta el momento en que el proceso haya terminado de ejecutarse; es posible que aún esté procesando la salida en esta etapa dependiendo de los otros subprocesos o pueden haber terminado antes de que su subproceso regrese.
Tienes la opción de añadir valor a nuestro contenido informacional añadiendo tu experiencia en las notas.