当前位置:  编程技术>java/j2ee

Java 进程执行外部程序造成阻塞的一种原因

    来源: 互联网  发布时间:2014-11-04

    本文导语:  查了好多资料,差点就动手翻Java源码了,最后结合一篇文章(忘记出处了),想到了输出流会阻塞进程执行。 Java进程执行有一个输入流,两个输出流(相对于外部程序)。当两个输出流有内容输出,而Java执行程序没有及时清空...

查了好多资料,差点就动手翻Java源码了,最后结合一篇文章(忘记出处了),想到了输出流会阻塞进程执行。 Java进程执行有一个输入流,两个输出流(相对于外部程序)。当两个输出流有内容输出,而Java执行程序没有及时清空输出流时就会阻塞进程。
现贴出代码,希望能帮助到有需要的同行:

代码如下:
/**
  * pdf转swf函数
  * @param path 输入输出文件路径
  * @param inputFileName 输入文件名
  * @param outputFileName 输出文件名
  * @return File 生成的swf文件
  */
 private static File toSwf(String sourceFile, String destFile, String command) {
  long beginTime = System.nanoTime();
  Runtime rt = Runtime.getRuntime();
  try {
   Process process = rt.exec(command);

   final InputStream isNormal = process.getInputStream();
   new Thread(new Runnable() {
       public void run() {
           BufferedReader br = new BufferedReader(new InputStreamReader(isNormal));
           StringBuilder buf = new StringBuilder();
     String line = null;
     try {
      while((line = br.readLine()) != null){
       buf.append(line + "n");
      }
     } catch (IOException e) {
      e.printStackTrace();
     }
     System.out.println("输出结果为:" + buf);
       }
   }).start(); // 启动单独的线程来清空process.getInputStream()的缓冲区

   InputStream isError = process.getErrorStream();
   BufferedReader br2 = new BufferedReader(new InputStreamReader(isError));
   StringBuilder buf = new StringBuilder();
   String line = null;
   while((line = br2.readLine()) != null){
    buf.append(line + "n");
   }
   System.out.println("错误输出结果为:" + buf);

   try {
    process.waitFor();
   } catch (InterruptedException e) {
    e.printStackTrace();
   }

  } catch (IOException e) {
   e.printStackTrace();
  }
  long endTime = System.nanoTime();
  System.out.println("转swf耗时: " + (endTime - beginTime) / 1000000000 + " 秒  " + sourceFile);
  return new File(destFile);
 }


    
 
 

您可能感兴趣的文章:

  • 非阻塞式服务器 Web.Java
  • Java锁之阻塞锁介绍和代码实例
  • lunix下,用java在代码中启动另外一个进程遇到的问题,新启动的进程被阻塞.
  • java socket长连接中解决read阻塞的3个办法
  • Java基于Runtime调用外部程序出现阻塞的解决方法
  • java执行bat命令碰到的阻塞问题的解决方法
  • 支持生产阻塞的Java线程池
  • java线程阻塞中断与LockSupport使用介绍
  • 高手指点:不用JNI,如何在Java进程中新起一个JVM并在其中启动另一个Java进程。
  • linux shell关掉后java程序(进程名abc)仍能运行,用ps -ef|grep abc能查到进程名
  • 为什么我在java程序里启动的一个程序在java程序关闭后,该程序的所有进程都关掉了
  • java进程保护
  • java -jar a.jar这些进程怎么杀啊?
  • 输出java进程的jstack信息示例分享 通过线程堆栈信息分析java线程
  • 如何启动和关闭一个进程(java写的)。
  • 在Java中,如何实现进程间通信,不用RMI
  • java实现进程间通信的方法有哪些?
  • java结束进程的实例代码
  • 求救:AIX下java进程堆内存存在大量空余,但rss内存不断增加
  • HP-Unix操作系统, java进程, Swap空间不释放
  • 在java中,什么情况下属于不同的进程,是在不同的classload中加载的class,还是在不同的jvm中加载的class
  • 请教:C代码中怎样fork出一个java子进程?
  • HELP!!! 关于java进程!解决就+100(急)
  • 如何用JAVA启动一个Windows的可执行程序或一个UNIX的进程??
  • 网络技术 iis7站长之家
  • ★★★★★linux shell关掉后java程序(进程名abc)仍能运行,用ps -ef|grep abc能查到进程名
  • java实现操作系统的短进程作业调度示例分享
  • 在Java程序中怎样写代码才能杀掉系统中的进程?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 内存泄漏是什么?怎么造成的?java中会不会产生内存泄漏?
  • Java流通讯造成线程锁定的问题!(一定看一看,急啊!)
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍
  • 我对JAVA一窍不通,可惜别人却给我一个Java的project,要我做一个安装程序,请问哪里有JAVA INSTALLER下载,而且我要不要安装java的sdk才能完成此项任务?
  • java命名空间java.security类keystore的类成员方法: getdefaulttype定义及介绍
  • 新年第一天,让我们讨论一下未来一年JAVA的发展趋势! 个人认为,JAVA将主要朝ERP和JAVA手机方面发展!
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getclasspath定义及介绍
  • 我想学Java,但不知道Java的实用的开发工具有那些,Java主要用在哪些方面,EJB到底是什么东西??
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: javaserializedobjectmimetype定义及介绍
  • redhat7.3下,java程序打印中文直接用java命令执行正常,用crontab执行java命令为乱码
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: javafilelistflavor定义及介绍
  • 各位学java的朋友,学java的未来是什么,你们学java都用来开发什么项目啊!来者给分!!
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getvmname定义及介绍
  • 请问java程序中的import为什么有的用java.….*,而有的又用java.….…,有什么区别吗?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3