[英]Help running Java runtime.exec() on multiple threads
在我的程序中,我需要使用Java在Ubuntu環境(ntpdate)中運行外部命令。 目前,我的代碼如下所示:
Runtime rt = Runtime.getRuntime();
byte[] readBuffer = new byte[131072];
// Exec a process to do the query
Process p = null;
try {
p = rt.exec("ntpdate -q " + ip);
} catch (Exception ex) {
ex.printStackTrace();
}
if(p!= null){
try {
Thread.sleep(1000);
} catch (Exception e) {
}
// Read the input stream, copy it to the file
InputStream in = p.getInputStream();
try {
int count = 0, rc;
while ((rc = in.read(readBuffer, count, readBuffer.length - count)) != -1) {
count += rc;
if (count >= readBuffer.length) {
p.destroy();
break;
}
}
p.destroy();
result = processOutput(readBuffer, count);
} catch (IOException ex) {
ex.printStackTrace();
}
p.destroy();
為了最大化性能,需要在多個線程上同時運行此代碼(我需要使用ntpdate測試1.000.000地址的列表)。 但是,它運行非常緩慢,幾乎不消耗機器處理時間。 我究竟做錯了什么? 我該如何提高效率?
嘗試使用.exec()執行“挖掘”時會出現相同的問題,因此我懷疑這是由於調用了特定程序所致。 在多線程環境中使用Runtime.exec()有一些限制嗎?
Java在這里最合適嗎? 也許在shell腳本中會更好,該腳本在后台多次調用ntpdate
? 我不確定用Java在此代碼段中能帶來什么好處。
您在處理InputStream
時在做什么?
bash腳本可以這樣做:
for ip in #...IP list
do
ntpdate -q $ip > $ip.txt &
done
為什么每次都等待1秒?
try {
Thread.sleep(1000);
} catch (Exception e) {
}
這只會降低應用程序的執行速度。
不知道為什么它很慢,但是您需要做更多的事情來關閉資源。 Runtime.exec()需要很多注意和注意,以避免掛起和文件描述符泄漏。
http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html
您確定問題不是ntpdate嗎? 如果ntpdate只是坐在那里等待服務器響應並且具有很大的超時值,那么您的應用程序也將坐在那里。
嘗試以0.2的超時值調用ntpdate,看看是否有區別。
另外,當您在代碼中打開流時,一定要在完成后顯式.close()它們。 否則,它可能要等到很長一段時間后才會發生,直到GC。
我想我找到了解決方案,那就是使用Java的Runtime.exec()沒有解決方案。 問題似乎是所有啟動進程的調用都已同步。 確實,如果您單獨啟動每個進程(通過同步),則獲得一起啟動所有進程的完全相同的結果。
exec是否有其他選擇? 否則,我將需要一些沒有Linux的ntpdate的解決方案...
我注意到您嘗試的兩個命令都涉及網絡往返。 如果您呼叫echo
或cat
類的東西,速度如何?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.