繁体   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