-2

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

我怎样才能使它异步,以便我的 java 进程不必等待,并且它以某种方式知道 shell 脚本何时完成。我没有使用 JMS 的选项。

请提出一个强大的解决方案。

4

3 回答 3

2

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

于 2013-01-14T05:18:30.390 回答
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();
    }
于 2013-01-14T05:23:05.107 回答
0

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

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

等待 4 小时什么都不做的单个线程的成本几乎没有。这是使用(通常)1Mb 的非堆空间来表示堆栈的成本。如果这些线程的数量很少,那么总空间就是几兆字节。除非您在内存受限的系统上运行,否则根本不值得担心。(称其为“不可取的” ...... IMO)。

如果您的内存受到限制,那么首先要尝试分配具有减小堆栈大小的线程;例如使用这个构造函数。我认为 10Kb 的线程堆栈足以完成这项任务。

于 2013-01-14T05:37:04.183 回答