从Java代码调用shell脚本

时间:2013-01-14 04:58:42

标签: java multithreading unix process

我想从java调用shell脚本。它可以使用Runtime.exec方法完成。但问题是shell脚本需要大约3-4个小时才能执行,并且不建议将Process.waitFor()应用于这么长的进程,因为它会使当前线程保持等待状态4个小时。这将发生在多线程环境中,其中多个Java线程将调用多个shell脚本,每个脚本消耗超过3个小时。 (虽然线程数会很小)

如何使其异步,以便我的java进程不必等待,并以某种方式知道shell脚本何时完成。我没有选择使用JMS。

请建议一个强有力的解决方案。

3 个答案:

答案 0 :(得分:2)

使用CallableFuture异步启动脚本,您可以在单独的线程中等待它

答案 1 :(得分:0)

可能类似于

class AsyncProcessRunner {

    class AsyncProcess implements Runnable {
        String cmd;
        int rc;
        String out;
        String err;

        AsyncProcess(String cmd) {
            this.cmd = cmd;
        }

        @Override
        public void run() {
            // run process here
            processEnded(this);
        }
    }

    void processEnded(AsyncProcess p) {
        // process termination
    }

    public void runAsync(String cmd) {
        new Thread(new AsyncProcess(cmd)).start();
    }

答案 2 :(得分:0)

  

但问题是shell脚本需要大约3-4个小时才能执行,并且不建议将Process.waitFor()应用于这么长的进程,因为它会使当前线程保持等待状态4个小时。这将发生在多线程环境中,其中多个Java线程将调用多个shell脚本,每个脚本消耗超过3个小时。 (虽然线程数会很小)

老实说,我认为你试图解决的问题很大程度上是虚构的。

等待4小时无所事事的单个线程的成本接下来没什么。使用(通常)1Mb非堆空间来表示堆栈的成本。如果这些线程的数量很小,那么总空间就是少量的兆字节。除非你在内存受限的系统上运行,否则它甚至不值得担心。 (可以称之为“不可取” ...... IMO)。

如果您的内存受到约束,那么首先要尝试的是分配具有减少的堆栈大小的线程;例如使用this constructor。我认为10Kb线程堆栈足以完成这项任务。