国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java基于Runtime調(diào)用外部程序出現(xiàn)阻塞的解決方法

2019-11-26 15:24:56
字體:
供稿:網(wǎng)友

本文實例講述了Java基于Runtime調(diào)用外部程序出現(xiàn)阻塞的解決方法, 是一個很實用的技巧。分享給大家供大家參考。具體分析如下:

有時候在java代碼中會調(diào)用一些外部程序,比如SwfTools來轉(zhuǎn)換swf、ffmpeg來轉(zhuǎn)換視頻等。如果你的代碼這樣寫:Runtime.getRuntime().exec(command),會發(fā)現(xiàn)程序一下就執(zhí)行完畢,而在命令行里要執(zhí)行一會,是因為java沒有等待外部程序的執(zhí)行完畢,此時就需要使用阻塞,來等待外部程序執(zhí)行結(jié)果:

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是沒有問題的。

但是緊接著又發(fā)現(xiàn)對于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程序設(shè)計的學(xué)習(xí)有所幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 上饶县| 开平市| 金湖县| 榕江县| 吴旗县| 阜城县| 汉沽区| 巧家县| 卓资县| 涪陵区| 祁连县| 临江市| 屯门区| 和平区| 大埔县| 扶绥县| 麻阳| 平罗县| 牡丹江市| 清河县| 扎囊县| 泰安市| 棋牌| 嵩明县| 新沂市| 麦盖提县| 鹤峰县| 麻栗坡县| 察隅县| 鄂伦春自治旗| 彰化市| 朝阳县| 双流县| 闽侯县| 漠河县| 铜山县| 旬邑县| 肇东市| 灌阳县| 句容市| 南昌市|