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
这一个栏位是用来让主线程等待两个子线程执行完毕用的.
分享到:
相关推荐
总的来说,解决Java执行bat命令时的阻塞问题,需要我们关注以下几点: 1. 使用`Runtime.exec()`时,应该考虑bat命令的执行时间和输出量。 2. 创建新的线程来处理bat命令的输出流,避免阻塞主线程。 3. 及时读取并...
总结,Java运行bat文件主要依赖于Runtime类或ProcessBuilder类,需要处理好输出流,注意异常处理,并根据需求选择同步或异步执行。在实际应用中,还需关注安全性和权限问题。通过以上步骤,你可以有效地在Java程序中...
当我们需要在Java程序中执行系统命令,比如运行一个批处理脚本(.bat文件)时,`Runtime`类或者其扩展类`ProcessBuilder`就派上了用场。下面我们将深入探讨如何使用`Runtime`执行bat脚本,并了解相关知识点。 1. **...
Java调用批处理程序(BAT文件)是一种常见的技术,它允许开发者在Java应用程序中执行Windows系统的命令行操作。本DEMO展示了如何通过Java代码来执行一个.bat文件,从而实现自动化任务或者集成到Java应用程序中。以下...
`RunScript.java`很可能是主类,它包含了一个方法来判断当前运行的操作系统,并根据系统类型来执行相应的脚本。在Windows中,批处理文件通常以`.bat`或`.cmd`为扩展名,而Linux和Unix系统中,shell脚本通常以`.sh`...
### Java执行可执行文件或批处理 在Java中执行外部可执行文件或批处理脚本是一种常见的需求,尤其是在需要调用系统级别的工具或者与操作系统进行交互时。通过Java的`Runtime`类及其提供的方法,我们可以方便地实现...
这份“BAT高级Java面试题70题目含答案”涵盖了Java核心、多线程、集合框架、JVM优化、设计模式、数据库操作、网络编程等多个方面的知识,旨在帮助求职者准备BAT的面试。 1. **Java基础** - 类与对象:理解面向对象...
接下来,关于Java执行Shell脚本,你可以使用`Runtime.exec()`或`ProcessBuilder`,但是你需要确保你的脚本文件是可执行的,并且指定正确的路径。例如,执行一个名为`myscript.sh`的Shell脚本: ```java String ...
在Java编程中,有时我们需要执行操作系统级别的任务,如运行DOS命令。这通常涉及到使用`Runtime`类的`exec()`方法。`Runtime.getRuntime().exec()`允许我们创建一个子进程来执行指定的命令或可执行程序。这个过程...
- 多线程:Java提供了Thread类和Runnable接口来实现并发执行,理解和掌握线程同步、锁机制是高级Java开发的关键。 - 集合框架:深入学习Set、List、Map接口及其实现类,如HashSet、ArrayList、LinkedList、HashMap...
下面将详细介绍TDA的使用方法、功能以及它如何帮助我们解决Java多线程问题。 首先,我们需要了解什么是线程堆栈(Thread Dump)。线程堆栈是Java虚拟机在某一时刻对所有活动线程的状态快照,包括线程ID、线程状态、...
Java面试是求职者在寻找Java相关职位时必须经历的关键环节,尤其对于BAT(百度、阿里巴巴、腾讯)这样的大型互联网公司,面试的要求更为严格且全面。本资料集合了个人在BAT公司的实际Java面试经历,总结出了一系列...
7. **IO与NIO**:Java的输入输出流体系,以及后来引入的非阻塞I/O(New Input/Output,NIO)框架,包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)的概念。 8. **反射**:了解如何在运行时动态地获取类...
Java是世界上最流行的编程语言之一,尤其在互联网巨头BAT(百度、阿里巴巴、腾讯)中,Java技术占据了核心地位。这份“2020最新BAT java经典必考面试题”压缩包内容,显然是一份针对Java开发者准备的面试复习资料,...
首先,Java提供了一个内置的`java.lang.Runtime`类,它可以让我们与运行Java虚拟机的同一操作系统进行交互,包括执行系统命令。我们可以使用`Runtime.getRuntime().exec()`方法来执行外部命令或脚本。例如,如果你有...
9. **反射机制**:Java反射是运行时动态访问和修改类、对象、方法的能力,面试中可能会考察其应用场景和潜在性能问题。 10. **设计模式**:23种设计模式是软件开发中的最佳实践,面试中可能会考察单例、工厂、装饰...
Traceview是Android开发过程中一个不可或缺的工具,它能够收集并可视化应用的Java层方法调用时间,帮助开发者定位性能瓶颈。通过Traceview,我们可以看到每个函数的执行时间、调用次数以及整体的耗时,这对于优化...
另外,虽然可以直接使用`Runtime.exec()`执行单条命令,但更推荐的方法是编写一个bat(Windows)或shell(Linux)脚本,将一系列命令封装在一起,然后通过Java执行这个脚本。这样可以更好地组织和管理复杂的命令序列...
在 Windows 平台上,运行被调用程序的 DOS 窗口在程序执行完毕后往往并不会自动关闭,从而导致 Java 应用程序阻塞在 waitfor()。解决的办法是,利用 Java 提供的 Process 类提供的方法让 Java 虚拟机截获被调用程序...
1. **Runtime类**:这是Java中最基础的系统运行时接口,它提供了执行操作系统命令的方法。`Runtime.getRuntime().exec(String command)`是主要的执行命令的方法。这个方法接受一个字符串参数,该参数应该包含完整的...