El ejemplo de este artículo describe la solución al bloqueo de programas externos llamados por Java basado en Runtime, que es una técnica muy práctica. Compártelo con todos para tu referencia. El análisis específico es el siguiente:
A veces, algunos programas externos se llaman en código java, como SwfTools para convertir swf, ffmpeg para convertir videos, etc. Si su código está escrito así: Runtime.getRuntime().exec(comando), encontrará que el programa se ejecuta inmediatamente, pero tarda un poco en ejecutarse en la línea de comando porque Java no espera la ejecución del programa externo para completar. Debe usar el bloqueo para esperar los resultados de ejecución del programa externo:
InputStream stderr = process.getInputStream();InputStreamReader isr = new InputStreamReader(stderr, "GBK");BufferedReader br = new BufferedReader(isr);String line = null; while ((line = br.readLine()) != null ) System.out.println(línea);int exitValue = proceso.waitFor();
Para programas externos generales, puede utilizar el código de bloqueo anterior. Al menos no hay ningún problema con pdf2swf.exe.
Pero luego descubrí que para ffmpeg, el código anterior haría que el programa se atascara y era necesario usar otro método, encapsulándolo en un método, de la siguiente manera:
@SuppressWarnings("static-access")public static int doWaitFor(Proceso proceso) { InputStream in = null; InputStream err = null; int exitValue = -1 // devuelto a la persona que llama cuando p termina try { in = process.getInputStream; (); err = Process.getErrorStream(); booleano terminado = falso // Se establece en verdadero cuando p finaliza while (!finished) { try { while; (in.available() > 0) { // Imprime la salida de nuestra llamada al sistema Character c = new Character((char) in.read(); System.out.print(c } while (err.available); () > 0) { // Imprime la salida de nuestra llamada al sistema Character c = new Character((char) err.read()); System.out.print(c); Si el proceso // no ha terminado, se lanza una excepción IllegalThreadStateException. Si finaliza, fallamos y // la variable terminado se establece en verdadero. exitValue = process.exitValue(); terminado todavía; // Duerme un poco para ahorrar ciclos de CPU Thread.currentThread().sleep(500); e.printStackTrace(); } finalmente { intentar { if (in!= null) { in.close() } } catch (IOException e) { e.printStackTrace() } if (err!= null) { try { err.close(); } catch (IOException e) { e.printStackTrace(); } } } return exitValue;}Espero que lo que describe este artículo sea útil para que todos aprendan sobre programación Java.