java - 帮助在多个线程上运行 Java runtime.exec()

标签 java process

在我的程序中,我需要使用 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() 执行“dig”时会出现同样的问题,所以我怀疑这是因为调用了特定的程序。在多线程环境中使用 Runtime.exec() 是否有一些限制?

最佳答案

Java 是这里最合适的方法吗?也许这在 shell 脚本中会更好,它在后台多次调用 ntpdate?我不确定在 Java 中执行此代码片段对您有何好处。

你在用进程中的 InputStream 做什么?


一个 bash 脚本可以这样做:

for ip in #...IP list
do
  ntpdate -q $ip > $ip.txt &
done

关于java - 帮助在多个线程上运行 Java runtime.exec(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3567264/

相关文章:

linux - 进程在 sleep 状态下使用 nohup 运行

macos - 如何从 go 启动 vim?

java - 分派(dispatch)到 View 时,如何停止使用 Spring 处理程序中的命令对象隐式丰富模型?

java - Apache 光束 : Kafka consumer restarted over and over again

java - ORMLite 异步操作

c# - 在C#中发送cmd命令并读取结果

java - 主方法中的 protected 变量

java - 如何从服务器加载MainActivity.java?

c# - 在应用程序退出时停止 Java 进程

c - 如何持续监控 Linux 中的进程创建?