Java基于Runtime调用外部程序出现阻塞的解决方法

 更新时间:2014年09月22日 09:27:33   投稿:shichen2014  
这篇文章主要介绍了Java基于Runtime调用外部程序出现阻塞的解决方法,是一个非常实用的技巧,需要的朋友可以参考下

本文实例讲述了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 jinfo命令

    详解java jinfo命令

    jinfo是jdk自带的命令,用来查看jvm的配置参数.通常会先使用jps查看java进程的id,然后使用jinfo查看指定pid的jvm信息,需要的朋友可以参考下
    2021-06-06
  • Go Java算法之字符串中第一个唯一字符详解

    Go Java算法之字符串中第一个唯一字符详解

    这篇文章主要为大家介绍了Go Java算法之字符串中第一个唯一字符详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • SpringBoot中事务失效的六个原因解析

    SpringBoot中事务失效的六个原因解析

    这篇文章主要介绍了SpringBoot中事务失效的六个原因解析,由于Spring的事务是基于AOP的方式结合动态代理来实现的,因此事务方法一定要是public的,这样才能便于被Spring做事务的代理和增强,需要的朋友可以参考下
    2023-10-10
  • SpringBoot2.3.0配置JPA的实现示例

    SpringBoot2.3.0配置JPA的实现示例

    这篇文章主要介绍了SpringBoot2.3.0配置JPA的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • SpringBoot整合Redis并且用Redis实现限流的方法 附Redis解压包

    SpringBoot整合Redis并且用Redis实现限流的方法 附Redis解压包

    这篇文章主要介绍了SpringBoot整合Redis并且用Redis实现限流的方法 附Redis解压包,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • String类下compareTo()与compare()方法比较

    String类下compareTo()与compare()方法比较

    这篇文章主要介绍了String类下compareTo()与compare()方法比较的相关资料,需要的朋友可以参考下
    2017-05-05
  • spring注解之@Valid和@Validated的区分总结

    spring注解之@Valid和@Validated的区分总结

    @Validated和@Valid在基本验证功能上没有太多区别,但在分组、注解地方、嵌套验证等功能上有所不同,下面这篇文章主要给大家介绍了关于spring注解之@Valid和@Validated区分的相关资料,需要的朋友可以参考下
    2022-03-03
  • java web将数据导出为pdf格式文件代码片段

    java web将数据导出为pdf格式文件代码片段

    这篇文章主要为大家详细介绍了java web将数据导出为pdf格式文件代码片段,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • redis发布订阅Java代码实现过程解析

    redis发布订阅Java代码实现过程解析

    这篇文章主要介绍了redis发布订阅Java代码实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • springboot解决Class path contains multiple SLF4J bindings问题

    springboot解决Class path contains multiple 

    这篇文章主要介绍了springboot解决Class path contains multiple SLF4J bindings问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07

最新评论