簡體   English   中英

幫助在多個線程上運行Java runtime.exec()

[英]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的解決方案...

我注意到您嘗試的兩個命令都涉及網絡往返。 如果您呼叫echocat類的東西,速度如何?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM