waitFor()一直等待,线程阻塞问题 —转载–Java中使用Runtime和Process类运行外部程序

使用Runtime.getRuntime().exec()方法可以在java程序里运行外部程序。
Java代码 收藏代码

1. exec(String command)
2. exec(String command, String envp[], File dir)
3. exec(String cmd, String envp[])
4. exec(String cmdarray[])
5. exec(String cmdarray[], String envp[])
6. exec(String cmdarray[], String envp[], File dir)

一般的应用程序可以直接使用第一版本,当有环境变量传递的时候使用后面的版本。其中2和6版本可以传递一个目录,标识当前目录,因为有些程序是使用相对目录的,所以就要使用这个版本。

cmd.exe /c start
使用DOS命令(比如dir)时也要使用到调用。如果想与调用的程序进行交互,那么就要使用该方法的返回对象Process了,通过Process的getInputStream(),getOutputStream()和getErrorStream()方法可以得到输入输出流,然后通过InputStream可以得到程序对控制台的输出信息,通过OutputStream可以给程序输入指令,这样就达到了程序的交换功能。
用Java编写应用时,有时需要在程序中调用另一个现成的可执行程序或系统命令,这时可以通过组合使用Java提供的Runtime类和Process类的方法实现。下面是一种比较典型的程序模式:
Java代码 收藏代码

1
2  Process process = Runtime.getRuntime().exec(".\\p.exe");
3  process.waitfor();
4

在上面的程序中,第一行的“.\p.exe”是要执行的程序名,Runtime.getRuntime()返回当前应用程序的Runtime对象,该对象的exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。通过Process可以控制该子进程的执行或获取该子进程的信息。第二条语句的目的等待子进程完成再往下执行。
但在windows平台上,如果处理不当,有时并不能得到预期的结果。下面是笔者在实际编程中总结的几种需要注意的情况:
1、执行DOS的内部命令
如果要执行一条DOS内部命令,有两种方法。一种方法是把命令解释器包含在exec()的参数中。例如,执行dir命令,在NT上,可写成exec(“cmd.exe /c dir”),在windows95/98下,可写成“command.exe /c dir”,其中参数“/c”表示命令执行后关闭DOS立即关闭窗口。另一种方法是,把内部命令放在一个批命令my_dir.bat文件中,在Java程序中写成exec(“my_dir.bat”)。如果仅仅写成exec(“dir”),Java虚拟机则会报运行时错误。前一种方法要保证程序的可移植性,需要在程序中读取运行的操作系统平台,以调用不同的命令解释器。后一种方法则不需要做更多的处理。
2、打开一个不可执行的文件
打开一个不可执行的文件,但该文件存在关联的应用程序,则可以有两种方式。以打开一个word文档a.doc文件为例,Java中可以有以下两种写法:
Java代码 收藏代码

1  exec("start .\\a.doc");
2  exec("Files\\Microsoft Office\\office\\winword.exe .\\a.doc");

显然,前一种方法更为简捷方便。
3、执行一个有标准输出的DOS可执行程序
在Windows平台上,运行被调用程序的DOS窗口在程序执行完毕后往往并不会自动关闭,从而导致Java应用程序阻塞在waitfor()语句。导致该现象的一个可能的原因是,该可执行程序的标准输出比较多,而运行窗口的标准输出缓冲区不够大。解决的办法是,利用Java中Process类提供的方法让Java虚拟机截获被调用程序的DOS运行窗口的标准输出,在waitfor()命令之前读出窗口的标准输出缓冲区中的内容。一段典型的程序如下:
Java代码 收藏代码

1
2  String s;
3  Process process = Runtime.getRuntime().exec("cmd /c dir \\windows");
4  BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream());
5  while((s=bufferedReader.readLine()) != null)
6  System.out.println(s);
7  process.waitfor();

waitFor()一直等待,线程阻塞问题相关推荐

  1. JAVE SE 学习day_09:sleep线程阻塞方法、守护线程、join协调线程同步方法、synchronized关键字解决多线程并发安全问题

    一.sleep线程阻塞方法 static void sleep(long ms) Thread提供的静态方法sleep可以让运行该方法的线程阻塞指定毫秒,超时后线程会自动回到RUNNABLE状态,等待 ...

  2. 守护线程与线程阻塞的四种情况

    守护线程  Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 用户线程即运行在前台的线程,而守护线程是运行在后台的线程. 守护线程作用是为其他前台线程的 ...

  3. Java并发编程(4):守护线程与线程阻塞的四种情况

    守护线程 Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 用户线程即运行在前台的线程,而守护线程是运行在后台的线程. 守护线程作用是为其他前台线程的运 ...

  4. 线程阻塞的概念 (Java 中的睡眠状态sleep 等待状态wait 礼让状态yield 自闭状态join suspend() 和 resume() )

    线程阻塞的概念: 线程阻塞通常是指一个线程在执行过程中暂停,以等待某个条件的触发. 参考文章1:什么是线程阻塞?为什么会出现线程阻塞? 参考文章2:线程阻塞

  5. 深入理解 Java 锁与线程阻塞

    相信大家对线程锁和线程阻塞都很了解,无非就是 synchronized, wait/notify 等, 但是你有仔细想过 Java 虚拟机是如何实现锁和阻塞的呢?它们之间又有哪些联系呢?如果感兴趣的话 ...

  6. 线程阻塞和挂起(网络收集)

    线程阻塞 线程在运行的过程中因为某些原因而发生阻塞,阻塞状态的线程的特点是:该线程放弃CPU的使用,暂停运行,只有等到导致阻塞的原因消除之后才回复运行.或者是被其他的线程中断,该线程也会退出阻塞状态, ...

  7. 详解Java多线程编程中LockSupport类的线程阻塞用法

    转载自  详解Java多线程编程中LockSupport类的线程阻塞用法 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际 ...

  8. java线程——阻塞队列

    [0]README 0.1)本文均转自两篇网络文章, 转载地址在转载处做了标记, 旨在理清 "阻塞队列"的相关知识 : [1]转自: http://www.cnblogs.com/ ...

  9. oracle线程阻塞_Oracle Service Bus –线程阻塞案例研究

    oracle线程阻塞 本案例研究描述了在AIX 6.1和IBM Java VM 1.6上运行的Oracle Service Bus 11g遇到的线程阻塞问题的完整根本原因分析过程. 本文也是您提高线程 ...

最新文章

  1. java连接oracle密码错误,java代码连接Oracle数据库出错,求解,以下是错误信息
  2. C#中lock死锁实例教程
  3. 用 Go 操作 MySQL 的 200 万数据时应该怎么搞?
  4. dynamic flash xml news----滚动新闻
  5. 第十二节:WebApi自动生成在线Api文档的两种方式
  6. mysql堵塞等级_MySQL 事务隔离级别
  7. java求圆弧切线_两个圆的公切线
  8. nginx核心模块ngx_http_core_module详解
  9. H.264视频质量评价算法(基于偏最小二乘法回归)
  10. php采集过滤内容,PHP采集利器:根据开始字符串和结束字符串截取需要的采集内容数据...
  11. VC2010 MFC程序制作Flash动画欢迎界面
  12. 李白打酒*C语言简易版(递归)
  13. uniapp 中使用不同字体
  14. 2022新版域名防红系统源码+功能强大
  15. 《JOEL说软件》-- Jole Spolsky
  16. pytorch操作基礎(二)——基礎
  17. Las Vegas算法八皇后问题最好的一种实现
  18. javaMail获取收件箱邮件之javax.mail.FolderNotFoundException
  19. js高德地图获取道路信息
  20. nodejs+vue+elementui婚纱影楼摄影拍照网站python java

热门文章

  1. linux程序设计中文第4百度云,Linux程序设计中文第4版-有书签.pdf
  2. 什么是大带宽?大带宽服务器的优势是什么?
  3. D3D来实现2D的效果 的方法
  4. [ubuntu20] hadoop3.1.2集群io测试
  5. Sharepoint 备份-还原-激活feature/工作流-安装wsp 脚本命令
  6. 5 types of thresholding
  7. java 练习-多线程 章节练习题及面试题
  8. 天禄科技在创业板上市:市值突破40亿元,募资金额缺口达2亿元
  9. Minecraft 开服:从入门到精通
  10. android系统数据业务知识点总结(一)