java在执行.bat文件时,经常会出现卡住不动的情况,我们称之为阻塞.
发生阻塞的原因是,在使用Runtime.getRuntime.exec("xx:/xxxx.bat")时,会有outputStream,ErrStream,InputStream三个IO流,如果这三个IO流都有数据的传输操作,那么必须对每一个IO流进行处理,如果有一个IO流漏处理了,那么程序将无限期的等待该IO流被处理,继而程序阻塞.
下面,已java打开安装apache2.2的.bat文件为例,说明一下如何处理阻塞.
package com.multiable.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.concurrent.CountDownLatch;
public class TestApache {
public static void main(String[] args) {
try {
final CountDownLatch threadSignal = new CountDownLatch(2);//初始化countDown
System.out.println("Start ......");
final Process pro = Runtime.getRuntime().exec("cmd /c \"c:\\start.bat\"");
pro.getOutputStream().close();
Runnable errThread = new Runnable() {
@Override
public void run() {
try {
InputStream is = pro.getErrorStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = "";
StringBuilder sb = new StringBuilder();
while((line = br.readLine()) != null) {
sb.append(line);
}
System.out.println("error : " + sb.toString());
} catch (IOException e) {
e.printStackTrace();
}
threadSignal.countDown();//线程结束时计数器减1
}
};
new Thread(errThread).start();
Runnable inputThread = new Runnable() {
@Override
public void run() {
try {
InputStream is = pro.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = "";
StringBuilder sb = new StringBuilder();
while((line = br.readLine()) != null) {
sb.append(line);
}
System.out.println("input : " + sb.toString());
is.close();
isr.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
threadSignal.countDown();//线程结束时计数器减1
}
};
new Thread(inputThread).start();
try {
threadSignal.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("=========================");
Runtime.getRuntime().exec("cmd /c net start apache2.2");
System.out.println("cmd /c net start apache2.2");
} catch (IOException e) {
e.printStackTrace();
}
}
}
关于OutputStream,程序用不到,直接在开始的时候就应该close掉.对于errStream & inputStream应该分别用一个线程来读取出IO流中的内容.
注意:必须使用线程,否则依然会阻塞.
final CountDownLatch threadSignal = new CountDownLatch(2);//初始化countDown
这一个栏位是用来让主线程等待两个子线程执行完毕用的.
分享到:
相关推荐
主要介绍了java执行bat命令碰到的阻塞问题的解决方法,有需要的朋友可以参考一下
源代码,jar包及bat文件,注意:bat文件中不能有空格。
有几个程序的代码,主要是关于将Java程序写到.bat文件中双击后直接运行
java执行bat文件方法,其实网上也有很多,我的稍微封装了一下而已
本人在Sublime Text3 配置java环境时对照网上的 输入的runJava.bat总有错 终于发现了空格也要输先改对了提供遇到同样问题的同学下载
java程序中关闭bat用到的。 退出bat。
shell,bat脚本运行java程序, shell,bat脚本运行java程序,
java不用cmd下面javac和java了,直接把写的还有main函数的java文件拖向Java快捷工具.bat Java快捷工具.bat
wsdl2java.bat
BAT面试常见问题,里面包含33道常见的java问题,有助于了解BAT面试的常见问题。
NULL 博文链接:https://weishaoxiang.iteye.com/blog/1237809
windows下启动java jar包的bat脚本 javaw后台启动,jdk1.8或者更高,winserver 2016 经过测试
java创建并调用bat文件
用Java写的,生成一个bat再调用,按时间从小到大排序,在指定的文件夹下为每个压缩文件单独建一个文件夹,需安装7z
find_java.bat 无法正常运行,可能是两个原因造成的:1、路径中包含括弧等特殊字符;2、Windows API 函数 GetShortPathName 未能正常工作
个人收集的一些关于java面试的资料。其中有java Beta5.0,bat公司面试题.
NULL 博文链接:https://xieruilin.iteye.com/blog/719322
自己总结得java(BAT)面试题汇总pdf版,总共834页,116道面试题的详细解答过程,有助于面试求职,积分不多,是自己辛辛苦苦整理的,麻烦广大求职友好评
NULL 博文链接:https://xinyuexiaodi.iteye.com/blog/643969
方便快捷设置环境变量。运行方式:单击右键,选择"以管理员身份运行",然后输入完整的JDK安装路径就可以了