一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java基于Runtime調用外部程序出現阻塞的解決方法

Java基于Runtime調用外部程序出現阻塞的解決方法

2019-11-29 16:03shichen2014 JAVA教程

這篇文章主要介紹了Java基于Runtime調用外部程序出現阻塞的解決方法,是一個非常實用的技巧,需要的朋友可以參考下

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

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

?
1
2
3
4
5
6
7
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來說,以上代碼會讓程序卡住不動,需要使用另一種方式,封裝成了一個方法,如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
@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程序設計的學習有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: www.av网站| 精彩国产萝视频在线 | 午夜精品久久久久久久2023 | 青草视频久久 | 亚洲网站在线看 | 国内揄拍国内精品久久 | 狠狠的撞进去嗯啊h女强男视频 | 国产精品理论片 | 亚洲欧美日韩综合在线播放 | 久久午夜一区二区 | 国产一区二区三区日韩 | 美女被免费视频 | 亚洲国产精品无圣光一区二区 | 好大好爽好硬我要喷水了 | 亚洲欧美日韩成人 | 欧美人妖大啪啪 | 91精品国产一区 | ai换脸杨幂被c在线观看 | 午夜福利自怕 | 男人天堂网av | 性一交一无一伦一精一品 | 草莓香蕉榴莲丝瓜秋葵绿巨人在线看 | 午夜一级影院 | 99在线视频免费 | 欧美在线视频免费播放 | 国产拍拍拍免费专区在线观看 | 欧美a一级片 | 日本一卡二卡3卡四卡无卡网址 | 黄动漫车车好快的车车双女主 | 亚洲一级片在线播放 | 精品女同一区二区三区免费站 | 国产老熟| 啊啊啊好爽在线观看 | 臀精插宫NP文| 国产成人小视频 | 亚洲人成在线播放 | 国产精品 色 | 美女被视频网站看免费入口 | 欧美一区二区三区免费观看视频 | 99视频在线观看免费视频 | 久久免费看少妇高潮A片JA |