Das Beispiel in diesem Artikel beschreibt die Lösung für das Blockieren externer Programme, die von Java basierend auf Runtime aufgerufen werden, was eine sehr praktische Technik ist. Teilen Sie es als Referenz mit allen. Die spezifische Analyse lautet wie folgt:
Manchmal werden einige externe Programme im Java-Code aufgerufen, z. B. SwfTools zum Konvertieren von SWF, ffmpeg zum Konvertieren von Videos usw. Wenn Ihr Code wie folgt geschrieben ist: Runtime.getRuntime().exec(command), werden Sie feststellen, dass das Programm sofort ausgeführt wird, die Ausführung in der Befehlszeile jedoch eine Weile dauert, da Java nicht auf die Ausführung des Programms wartet Um das externe Programm abzuschließen, müssen Sie die Blockierung verwenden, um auf die Ausführungsergebnisse des externen Programms zu warten:
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(line);int exitValue = process.waitFor();
Für allgemeine externe Programme können Sie den oben genannten Blockierungscode verwenden. Zumindest gibt es kein Problem mit pdf2swf.exe.
Aber dann habe ich festgestellt, dass der obige Code für ffmpeg dazu führen würde, dass das Programm hängen bleibt und eine andere Methode verwendet werden muss, um es wie folgt in eine Methode zu kapseln:
@SuppressWarnings("static-access")public static int doWaitFor(Process process) { InputStream in = null; InputStream err = null; // wird an den Aufrufer zurückgegeben, wenn p fertig ist try { in = process.getInputStream (); err = process.getErrorStream(); boolean done = false; // Auf true setzen, wenn p fertig ist while (!finished) { try { while (in.available() > 0) { // Ausgabe unseres Systemaufrufs ausgeben Character c = new Character((char) in.read() } while (err.available () > 0) { // Ausgabe unseres Systemaufrufs ausgeben Character c = new Character((char) err.read()); System.out.print(c); Wenn der Vorgang // noch nicht abgeschlossen ist, eine IllegalThreadStateException // wird geworfen und die Variable „finished“ wird auf „true“ gesetzt noch fertig; // Etwas schlafen, um CPU-Zyklen zu sparen Thread.currentThread().sleep(500); e.printStackTrace(); } Finally { if (in != null) { in.close(); } Catch (IOException e) { e.printStackTrace( } if (err != null) { try { err.close(); } Catch (IOException e) { e.printStackTrace(); } } return exitValue;}Ich hoffe, dass das, was in diesem Artikel beschrieben wird, jedem beim Erlernen der Java-Programmierung hilfreich sein wird.