我想从java调用shell脚本。它可以使用Runtime.exec方法完成。但问题是shell脚本需要大约3-4个小时才能执行,并且不建议将Process.waitFor()应用于这么长的进程,因为它会使当前线程保持等待状态4个小时。这将发生在多线程环境中,其中多个Java线程将调用多个shell脚本,每个脚本消耗超过3个小时。 (虽然线程数会很小)
如何使其异步,以便我的java进程不必等待,并以某种方式知道shell脚本何时完成。我没有选择使用JMS。
请建议一个强有力的解决方案。
答案 0 :(得分:2)
使用Callable
和Future
异步启动脚本,您可以在单独的线程中等待它
答案 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线程堆栈足以完成这项任务。