java执行bat命令碰到的阻塞问题

使用Java来执行bat命令,如果bat操作时间过长,有可能导致阻塞问题,而且不会执行bat直到关闭服务器。

如:

[java]
  1. Runtime r=Runtime.getRuntime();
  2.         Process p=null;
  3.         try{
  4.             String path = “D:/test.bat”;
[java]
  1.     p = r.exec(“cmd.exe /c  “+path);
  2.     p.waitFor();
  3. }catch(Exception e){
  4.     System.out.println(“运行错误:”+e.getMessage());
  5.     e.printStackTrace();
  6. }

一般java的exec是没有帮你处理线程阻塞问题的,需要手动处理。

处理后:

[java]
  1. Runtime r=Runtime.getRuntime();
  2.         Process p=null;
  3.         try{
  4.             String path = “D:/test.bat”;
[java]
  1. p = r.exec(“cmd.exe /c  “+path);
[java]  
  1.             StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), “ERROR”);
  2.                 errorGobbler.start();
  3.                  StreamGobbler outGobbler = new StreamGobbler(p.getInputStream(), “STDOUT”);
  4.                  outGobbler.start();
[java] 
  1.     p.waitFor();
  2. }catch(Exception e){
  3.     System.out.println(“运行错误:”+e.getMessage());
  4.     e.printStackTrace();
  5. }

 

 

StreamGobbler 类如下:

[java]  
  1. package com.test.tool;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStream;
  7. import java.io.PrintWriter;
  8. /**
  9.  * 用于处理Runtime.getRuntime().exec产生的错误流及输出流
  10.  */
  11. public class StreamGobbler extends Thread {
  12.     InputStream is;
  13.     String type;
  14.     OutputStream os;
  15.     StreamGobbler(InputStream is, String type) {
  16.         this(is, type, null);
  17.     }
  18.     StreamGobbler(InputStream is, String type, OutputStream redirect) {
  19.         this.is = is;
  20.         this.type = type;
  21.         this.os = redirect;
  22.     }
  23.     public void run() {
  24.         InputStreamReader isr = null;
  25.         BufferedReader br = null;
  26.         PrintWriter pw = null;
  27.         try {
  28.             if (os != null)
  29.                 pw = new PrintWriter(os);
  30.             isr = new InputStreamReader(is);
  31.             br = new BufferedReader(isr);
  32.             String line=null;
  33.             while ( (line = br.readLine()) != null) {
  34.                 if (pw != null)
  35.                     pw.println(line);
  36.                 System.out.println(type + “>” + line);
  37.             }
  38.             if (pw != null)
  39.                 pw.flush();
  40.         } catch (IOException ioe) {
  41.             ioe.printStackTrace();
  42.         } finally{
  43.             try {
  44.                 pw.close();
  45.                 br.close();
  46.                 isr.close();
  47.             } catch (IOException e) {
  48.                 e.printStackTrace();
  49.             }
  50.         }
  51.     }
  52. }

运行bat,就不会阻塞了。

 

标签