`

java执行bat阻塞的解决方法

阅读更多
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
这一个栏位是用来让主线程等待两个子线程执行完毕用的.
分享到:
评论
2 楼 lanfen100 2014-06-16  
try { 
                threadSignal.await(); 
            } catch (InterruptedException e) { 
                e.printStackTrace(); 
            } 


这里为什么要 await() 等待呢????
1 楼 染色体zz 2013-01-09  
  学习了,找了好久,用线程处理也试过几种,都差不多类型,后来需要读取到运行Bat文件的内容,只有写入文件,才能.

相关推荐

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

    总的来说,解决Java执行bat命令时的阻塞问题,需要我们关注以下几点: 1. 使用`Runtime.exec()`时,应该考虑bat命令的执行时间和输出量。 2. 创建新的线程来处理bat命令的输出流,避免阻塞主线程。 3. 及时读取并...

    Java 运行 bat 文件

    总结,Java运行bat文件主要依赖于Runtime类或ProcessBuilder类,需要处理好输出流,注意异常处理,并根据需求选择同步或异步执行。在实际应用中,还需关注安全性和权限问题。通过以上步骤,你可以有效地在Java程序中...

    Runtime 执行bat

    当我们需要在Java程序中执行系统命令,比如运行一个批处理脚本(.bat文件)时,`Runtime`类或者其扩展类`ProcessBuilder`就派上了用场。下面我们将深入探讨如何使用`Runtime`执行bat脚本,并了解相关知识点。 1. **...

    java_bat.rar_DEMO

    Java调用批处理程序(BAT文件)是一种常见的技术,它允许开发者在Java应用程序中执行Windows系统的命令行操作。本DEMO展示了如何通过Java代码来执行一个.bat文件,从而实现自动化任务或者集成到Java应用程序中。以下...

    java在win下启动bat和在linux下启动shell脚本

    `RunScript.java`很可能是主类,它包含了一个方法来判断当前运行的操作系统,并根据系统类型来执行相应的脚本。在Windows中,批处理文件通常以`.bat`或`.cmd`为扩展名,而Linux和Unix系统中,shell脚本通常以`.sh`...

    java执行可执行文件或批处理

    ### Java执行可执行文件或批处理 在Java中执行外部可执行文件或批处理脚本是一种常见的需求,尤其是在需要调用系统级别的工具或者与操作系统进行交互时。通过Java的`Runtime`类及其提供的方法,我们可以方便地实现...

    BAT高级Java面试题70题目含答案

    这份“BAT高级Java面试题70题目含答案”涵盖了Java核心、多线程、集合框架、JVM优化、设计模式、数据库操作、网络编程等多个方面的知识,旨在帮助求职者准备BAT的面试。 1. **Java基础** - 类与对象:理解面向对象...

    java_dos_shell_bat

    接下来,关于Java执行Shell脚本,你可以使用`Runtime.exec()`或`ProcessBuilder`,但是你需要确保你的脚本文件是可执行的,并且指定正确的路径。例如,执行一个名为`myscript.sh`的Shell脚本: ```java String ...

    JAVA执行DOS命令分析

    在Java编程中,有时我们需要执行操作系统级别的任务,如运行DOS命令。这通常涉及到使用`Runtime`类的`exec()`方法。`Runtime.getRuntime().exec()`允许我们创建一个子进程来执行指定的命令或可执行程序。这个过程...

    Java学习、面试必备

    - 多线程:Java提供了Thread类和Runnable接口来实现并发执行,理解和掌握线程同步、锁机制是高级Java开发的关键。 - 集合框架:深入学习Set、List、Map接口及其实现类,如HashSet、ArrayList、LinkedList、HashMap...

    java线程分析工具TDA

    下面将详细介绍TDA的使用方法、功能以及它如何帮助我们解决Java多线程问题。 首先,我们需要了解什么是线程堆栈(Thread Dump)。线程堆栈是Java虚拟机在某一时刻对所有活动线程的状态快照,包括线程ID、线程状态、...

    java面试-BAT个人真实java面试精华题-面经

    Java面试是求职者在寻找Java相关职位时必须经历的关键环节,尤其对于BAT(百度、阿里巴巴、腾讯)这样的大型互联网公司,面试的要求更为严格且全面。本资料集合了个人在BAT公司的实际Java面试经历,总结出了一系列...

    JAVA经典面试题库

    7. **IO与NIO**:Java的输入输出流体系,以及后来引入的非阻塞I/O(New Input/Output,NIO)框架,包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)的概念。 8. **反射**:了解如何在运行时动态地获取类...

    2020最新BAT java经典必考面试题.zip

    Java是世界上最流行的编程语言之一,尤其在互联网巨头BAT(百度、阿里巴巴、腾讯)中,Java技术占据了核心地位。这份“2020最新BAT java经典必考面试题”压缩包内容,显然是一份针对Java开发者准备的面试复习资料,...

    Java 执行本地脚本携带多参数

    首先,Java提供了一个内置的`java.lang.Runtime`类,它可以让我们与运行Java虚拟机的同一操作系统进行交互,包括执行系统命令。我们可以使用`Runtime.getRuntime().exec()`方法来执行外部命令或脚本。例如,如果你有...

    BAT 115个Java面试题和答案——终极(上)

    9. **反射机制**:Java反射是运行时动态访问和修改类、对象、方法的能力,面试中可能会考察其应用场景和潜在性能问题。 10. **设计模式**:23种设计模式是软件开发中的最佳实践,面试中可能会考察单例、工厂、装饰...

    traceview.bat

    Traceview是Android开发过程中一个不可或缺的工具,它能够收集并可视化应用的Java层方法调用时间,帮助开发者定位性能瓶颈。通过Traceview,我们可以看到每个函数的执行时间、调用次数以及整体的耗时,这对于优化...

    java执行Linux命令的方法

    另外,虽然可以直接使用`Runtime.exec()`执行单条命令,但更推荐的方法是编写一个bat(Windows)或shell(Linux)脚本,将一系列命令封装在一起,然后通过Java执行这个脚本。这样可以更好地组织和管理复杂的命令序列...

    JAVA如何调用DOS命令

    在 Windows 平台上,运行被调用程序的 DOS 窗口在程序执行完毕后往往并不会自动关闭,从而导致 Java 应用程序阻塞在 waitfor()。解决的办法是,利用 Java 提供的 Process 类提供的方法让 Java 虚拟机截获被调用程序...

    java 调用windows的一些可执行文件

    1. **Runtime类**:这是Java中最基础的系统运行时接口,它提供了执行操作系统命令的方法。`Runtime.getRuntime().exec(String command)`是主要的执行命令的方法。这个方法接受一个字符串参数,该参数应该包含完整的...

Global site tag (gtag.js) - Google Analytics