Java基於Runtime呼叫外部程式出現阻塞的解決方法

NO IMAGE

本文例項講述了Java基於Runtime呼叫外部程式出現阻塞的解決方法, 是一個很實用的技巧。分享給大家供大家參考。具體分析如下:

有時候在java程式碼中會呼叫一些外部程式,比如SwfTools來轉換swf、ffmpeg來轉換視訊等。如果你的程式碼這樣寫:Runtime.getRuntime().exec(command),會發現程式一下就執行完畢,而在命令列裡要執行一會,是因為java沒有等待外部程式的執行完畢,此時就需要使用阻塞,來等待外部程式執行結果:


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();

對於一般的外部程式使用上面的阻塞程式碼就可以,至少pdf2swf.exe是沒有問題的。

但是緊接著又發現對於ffmpeg來說,以上程式碼會讓程式卡住不動,需要使用另一種方式,封裝成了一個方法,如下:


@SuppressWarnings("static-access")
public static int doWaitFor(Process process) {
InputStream in = null;
InputStream err = null;
int exitValue = -1; // returned to caller when p is finished
try {
in = process.getInputStream();
err = process.getErrorStream();
boolean finished = false; // Set to true when p is finished
while (!finished) {
try {
while (in.available() > 0) {
// Print the output of our system call
Character c = new Character((char) in.read());
System.out.print(c);
}
while (err.available() > 0) {
// Print the output of our system call
Character c = new Character((char) err.read());
System.out.print(c);
}
// Ask the process for its exitValue. If the process
// is not finished, an IllegalThreadStateException
// is thrown. If it is finished, we fall through and
// the variable finished is set to true.
exitValue = process.exitValue();
finished = true;
} catch (IllegalThreadStateException e) {
// Process is not finished yet;
// Sleep a little to save on CPU cycles
Thread.currentThread().sleep(500);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
if (err != null) {
try {
err.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return exitValue;
}

希望本文所述對大家Java程式設計的學習有所幫助。

您可能感興趣的文章:

Java 常見異常(Runtime Exception )詳細介紹並總結Java異常處理執行時異常(RuntimeException)詳解及例項Java Runtime類詳解_動力節點Java學院整理解析Java的Spring框架的BeanPostProcessor釋出處理器Java Process類的詳解及例項程式碼Java Process詳解及例項Java 程序執行外部程式造成阻塞的一種原因oracle如何使用java source呼叫外部程式Java程式設計使用Runtime和Process類執行外部程式的方法