這是一個後續問題,以我的其他問題:Run bat file in Java and wait運行bat文件,並等待2
我張貼此作爲一個單獨的問題的原因是一個我已經問了正確回答。從一些研究中我發現我的問題對我而言是獨一無二的,所以我決定創建一個新的問題。在繼續這個問題之前,請仔細閱讀這個問題,因爲它們密切相關。
運行建議的代碼會阻止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
任何想法,爲什麼我的過程不會退出?還是你有任何庫建議處理正確執行批處理文件,並等待直到執行完成?
這將導致進程立即退出。我想要的是等到它完成。 – 2010-03-15 15:51:06
@sav:刪除'start'。 – Joey 2010-03-15 15:53:17
是的,我想到了,但不幸的是,如果你自己嘗試一下,你會發現它不會執行bat文件...我嘗試了所有的組合。沒有用。有些將永遠阻止,有些將不會彈出cmd窗口... – 2010-03-15 16:12:10