java执行bat命令碰到的阻塞问题
使用Java来执行bat命令,如果bat操作时间过长,有可能导致阻塞问题,而且不会执行bat直到关闭服务器。
如:
[java]
- Runtime r=Runtime.getRuntime();
- Process p=null;
- try{
- String path = “D:/test.bat”;
[java]
- p = r.exec(“cmd.exe /c “+path);
- p.waitFor();
- }catch(Exception e){
- System.out.println(“运行错误:”+e.getMessage());
- e.printStackTrace();
- }
一般java的exec是没有帮你处理线程阻塞问题的,需要手动处理。
处理后:
[java]
- Runtime r=Runtime.getRuntime();
- Process p=null;
- try{
- String path = “D:/test.bat”;
[java]
- p = r.exec(“cmd.exe /c “+path);
[java]
- StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), “ERROR”);
- errorGobbler.start();
- StreamGobbler outGobbler = new StreamGobbler(p.getInputStream(), “STDOUT”);
- outGobbler.start();
[java]
- p.waitFor();
- }catch(Exception e){
- System.out.println(“运行错误:”+e.getMessage());
- e.printStackTrace();
- }
StreamGobbler 类如下:
[java]
- package com.test.tool;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.OutputStream;
- import java.io.PrintWriter;
- /**
- * 用于处理Runtime.getRuntime().exec产生的错误流及输出流
- */
- public class StreamGobbler extends Thread {
- InputStream is;
- String type;
- OutputStream os;
- StreamGobbler(InputStream is, String type) {
- this(is, type, null);
- }
- StreamGobbler(InputStream is, String type, OutputStream redirect) {
- this.is = is;
- this.type = type;
- this.os = redirect;
- }
- public void run() {
- InputStreamReader isr = null;
- BufferedReader br = null;
- PrintWriter pw = null;
- try {
- if (os != null)
- pw = new PrintWriter(os);
- isr = new InputStreamReader(is);
- br = new BufferedReader(isr);
- String line=null;
- while ( (line = br.readLine()) != null) {
- if (pw != null)
- pw.println(line);
- System.out.println(type + “>” + line);
- }
- if (pw != null)
- pw.flush();
- } catch (IOException ioe) {
- ioe.printStackTrace();
- } finally{
- try {
- pw.close();
- br.close();
- isr.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
运行bat,就不会阻塞了。