我有一個程序(使用Java),需要在執行過程中多次使用另一個程序,使用不同的參數。它是多線程的,除了在執行過程中調用該程序外,還需要做其他事情,所以我需要使用Java來完成此任務。在Java中多次運行命令行程序 - 這是正確的嗎?
問題是,所有的Runtime.exec()
調用似乎都是由Java以同步的方式完成的,這樣線程就不會受到函數本身的瓶頸,而是在Java調用中遇到瓶頸。因此,我們有一個非常緩慢的運行程序,但這並不是任何系統資源的瓶頸。
爲了解決這個問題,我決定使用這個腳本不關閉進程,並撥打所有電話:
#!/bin/bash
read choice
while [ "$choice" != "end" ]
do
$choice
read choice
done
而且以前所有的exec調用受此取代:
private Process ntpProc;
Initializer(){
try {
ntpProc = Runtime.getRuntime().exec("./runscript.sh");
} catch (Exception ex) {
//Error Processing
}
}
public String callFunction(String function) throws Exception e{
OutputStream os = ntpProc.getOutputStream();
String result = "";
os.write((function + "\n").getBytes());
os.flush();
BufferedReader bis = new BufferedReader(new InputStreamReader(ntpProc.getInputStream()));
int timeout = 5;
while(!bis.ready() && timeout > 0){
try{
sleep(1000);
timeout--;
}
catch (InterruptedException e) {}
}
if(bis.ready()){
while(bis.ready()) result += bis.readLine() + "\n";
String errorStream = "";
BufferedReader bes = new BufferedReader(new InputStreamReader(ntpProc.getErrorStream()));
while(bes.ready()) errorStream += bes.readLine() + "\n";
}
return result;
}
public void Destroyer() throws exception{
BufferedOutputStream os = (BufferedOutputStream) ntpProc.getOutputStream();
os.write(("end\n").getBytes());
os.close();
ntpProc.destroy();
}
工作得很好,實際上設法將我的節目表現提高了10倍。所以,我的問題是:這是正確的嗎?還是我錯過了這樣做的事情,最終會使一切都變得非常糟糕?
您是否正確使用Java線程?我的意思是,你打電話給start()還是run()? – 2010-11-12 16:44:08