如果我想在同一个jvm中运行多个进程而不进行同步(我不关心同时运行的多个事情......我只想避免重新启动jvm),什么是最佳解决方案?
启动一个线程并加入以等待它死亡,然后创建另一个线程来执行另一个任务?
答案 0 :(得分:4)
让我想起JSR 121 Isolates。该规范已经完成,但我不确定这些东西是否曾经发生过实施方式。还有followup JSR 284。
答案 1 :(得分:3)
您可以使用Ant Java
task在同一JVM中运行多个Java应用程序 - 只需确保fork
参数设置为false
(默认值)。链接的帮助页面提供了一些示例。
答案 2 :(得分:1)
您最好的标准解决方案是在应用程序服务器中运行/部署应用程序。这假设您正在处理一个应用程序,其应用程序服务器的开销并没有掩盖单个实例运行的优势。缺点是部署时间会很长。
如果您只是希望拥有能够更快启动的小型Java应用程序,那么您的运气绝大。已经有一些尝试在实验性JVM中实现这一点。我们的想法是,如果JVM正在运行,那么将类调用附加到此运行实例,而不是启动新的JVM。但据我所知,这一切都没有进入任何主流JVM。
答案 3 :(得分:1)
在我看来问题是,默认情况下,当你执行你的java应用程序时,你会遇到一个入口点(即jar的Main-Class,或者你在java命令行中指定的任何内容),然后是jvm终止。如果从BeanShell命令行运行进程,则可以手动调用任意数量的命令。
例如:
java -cp bsh-2.0b4.jar;yourapp.jar bsh.Console
然后,
bsh % com.domain.prog.Mainclass.main( new String[] { } );
答案 4 :(得分:0)
Runtime.exec方法创建本机进程并返回Process子类的实例,该实例可用于控制进程并获取有关它的信息。 Process类提供了从进程执行输入,执行输出到进程,等待进程完成,检查进程的退出状态以及销毁(杀死)进程的方法。
答案 5 :(得分:0)
进程运行JVM; JVM不运行进程(尽管它们可以启动进程,如前所述)。因此,无法在同一JVM下拥有多个进程。
答案 6 :(得分:0)
如你所说,启动一个线程并加入等待它死亡,只会串行运行你的工作。我假设你只想同时运行多个东西。只需通过创建新线程或Runnables来启动单独的线程。您只需编写一个run()方法,声明您希望线程使用的内容并调用start():
public class T1 extends Thread {
public void run () { .. do something useful .. }
}
public class T2 extends Thread { ... yadda yadda }
public static void main (String args[] )
{
new T1().start();
new T2().start();
}
答案 7 :(得分:0)
您可以使用A.)将该类添加到类路径中,然后导入/运行该应用程序 或者可能更符合您要查找的内容,您可以使用Classloaders / Reflection来加载一个类并找到它的main(String [] args)方法然后调用它。
答案 8 :(得分:0)
您甚至不需要线程来顺序运行许多其他Java程序:
public class RunPrograms {
public void main(args) {
<for each applicationClass and args> {
try {
applicationClass.main(args)
} catch Exception e {
// if you want the entire set to die if one dies, rethrow (or don't catch)
// otherwise somehow log the error and continue
}
}
}
}
如果任何程序调用{{1}},您将遇到麻烦,但对于使用单个jvm的任何系统都是如此。