当前位置:  编程技术>java/j2ee

java执行bat命令碰到的阻塞问题的解决方法

    来源: 互联网  发布时间:2014-11-01

    本文导语:  使用Java来执行bat命令,如果bat操作时间过长,有可能导致阻塞问题,而且不会执行bat直到关闭服务器。如: 代码如下:Runtime r=Runtime.getRuntime();          Process p=null;          try{              String path = "D:/test.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,就不会阻塞了。

    
 
 

您可能感兴趣的文章:

  • 非阻塞式服务器 Web.Java
  • Java锁之阻塞锁介绍和代码实例
  • lunix下,用java在代码中启动另外一个进程遇到的问题,新启动的进程被阻塞.
  • java socket长连接中解决read阻塞的3个办法
  • Java 进程执行外部程序造成阻塞的一种原因
  • Java基于Runtime调用外部程序出现阻塞的解决方法
  • 支持生产阻塞的Java线程池
  • java线程阻塞中断与LockSupport使用介绍
  • 我刚刚学java,可是碰到下面一个问题,请问该如何解决。
  • 请碰到过的哥们回应。Java GUI程序中如何设置显示字体呢?
  • 编java mail时碰到的问题?高手帮忙!
  • 问:程序运行时碰到java.lang.NoClassDefFoundError的出错原因
  • windows命令行中java和javac、javap使用详解(java编译命令) iis7站长之家
  • 碰到这个错误,真是急死人了!!!(java2运行环境)
  • 小弟初用java碰到一个想不通的问题
  • 刚刚学java不久,碰到难题了!轻各位帮忙
  • 我又碰到难题了!!!Apache + Tomcat 怎样配置才能支持ssl? 还有,怎样使java程序能够通过局域网代理访问外网?
  • 在用java web start时碰到的问题?定给分
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • redhat7.3下,java程序打印中文直接用java命令执行正常,用crontab执行java命令为乱码
  • java怎样实现 运行dos命令行的命令或者windows的程序
  • Saloris系统下,如何使用java调用setenv命令和source命令????
  • windows命令行中java和javac、javap使用详解(java编译命令)
  • java程序在linux运行,要用Runtime.exec()执行外部命令,可外部命令中关于文件操作的路径都很长,如何使用相对路径.在线等待
  • 请java高手,为我解释一下这个命令是干什么的?《java核心技术2》
  • 运行JAVA命令错误
  • 我用JDK中的javac命令编译一个test.java。系统提示不能打开test.java该文件!!!
  • 如何使用java这个命令?
  • 关于JAVA调用linux命令 生成密钥对的问题
  • msdos中如何用java命令执行程序
  • 我要生成java 的文档在dos 下用什么命令.
  • 我在执行javac命令的时候没有问题,但是在执行java命令的时候却报如下错误
  • 哪位高手知道java怎么执行liunx的命令?
  • java命令执行类文件时不在bin的目录下出现Exception in thread "main" java.lang.NoClassDefFoundError:
  • java中如何执行dos命令,如文件删除等(时间紧急)
  • 关于jre命令替换为java
  • Java程序中如何执行系统命令?
  • 用 java 命令运行 .class 出错,怎么办
  • 怎样用Java调用window命令或启动其它程序?
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3