发布于 2016-07-10 06:15:40 | 202 次阅读 | 评论: 0 | 来源: 网友投递

这里有新鲜出炉的Java设计模式,程序狗速度看过来!

Java程序设计语言

java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称。


这篇文章主要介绍了java执行bat命令碰到的阻塞问题的解决方法,有需要的朋友可以参考一下

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


Runtime r=Runtime.getRuntime();  
        Process p=null;  
        try{  
            String path = "D:/test.bat";  
     p = r.exec("cmd.exe /c  "+path);  
     p.waitFor();  
 }catch(Exception e){   
     System.out.println("运行错误:"+e.getMessage());  
     e.printStackTrace();   
}  

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


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

StreamGobbler 类如下:


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,就不会阻塞了。



最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务