jvm的多java进程?

时间:2009-07-01 18:32:37

标签: java multithreading

如果我想在同一个jvm中运行多个进程而不进行同步(我不关心同时运行的多个事情......我只想避免重新启动jvm),什么是最佳解决方案?

启动一个线程并加入以等待它死亡,然后创建另一个线程来执行另一个任务?

9 个答案:

答案 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的任何系统都是如此。