java 调用 bat waitfor_在Java中运行bat文件并等待2

本文档描述了在Java中调用BAT文件时遇到的问题,即使用`Runtime.exec()`执行命令后,`waitFor()`方法阻塞。解决方法包括清空输出流和错误流,以及尝试通过循环检查`exitValue()`来避免阻塞。然而,作者仍然遇到`IllegalThreadStateException`,表明进程未退出。寻求解决方案或推荐用于正确执行和等待批处理文件完成的库。
摘要由CSDN通过智能技术生成

我将其作为一个单独的问题发布的原因是,我已经问过的一个问题得到了正确回答。通过一些研究,我发现我的问题是我所遇到的问题所独有的,因此我决定创建一个新问题。由于它们关系密切,因此请先阅读该问题,然后再继续进行此问题。

运行建议的代码会在waitFor调用时阻止程序。经过一番研究,我发现,如果您的进程具有需要处理的输出,则waitFor方法会阻塞,因此您应该首先清空输出流和错误流。我做了这些事情,但我的方法仍然受阻。然后,我发现一个建议,可以在等待exitValue方法返回过程的退出值时简单地循环并处理抛出的异常(如果不是),暂停一会儿,以免消耗掉所有CPU。我这样做:

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

public class Test {

public static void main(String[] args) {

try {

Process p = Runtime.getRuntime().exec(

"cmd /k start SQLScriptsToRun.bat" + " -UuserName -Ppassword"

+ " projectName");

final BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));

final BufferedReader error = new BufferedReader(new InputStreamReader(p.getErrorStream()));

new Thread(new Runnable() {

@Override

public void run() {

try {

while (input.readLine()!=null) {}

} catch (IOException e) {

e.printStackTrace();

}

}

}).start();

new Thread(new Runnable() {

@Override

public void run() {

try {

while (error.readLine()!=null) {}

} catch (IOException e) {

e.printStackTrace();

}

}

}).start();

int i = 0;

boolean finished = false;

while (!finished) {

try {

i = p.exitValue();

finished = true;

} catch (IllegalThreadStateException e) {

e.printStackTrace();

try {

Thread.sleep(500);

} catch (InterruptedException e1) {

e1.printStackTrace();

}

}

}

System.out.println(i);

} catch (IOException e) {

e.printStackTrace();

}

}

}

但是我的过程不会结束!我不断收到此错误:

java.lang.IllegalThreadStateException: process has not exited

关于为什么我的流程无法退出的任何想法?还是您有任何库建议使用适当的批处理文件,然后等待执行完成?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值