代码之家  ›  专栏  ›  技术社区  ›  LB40

JVM的多Java进程?

  •  3
  • LB40  · 技术社区  · 15 年前

    如果我想在同一个jvm中运行多个进程而不进行同步(我不在乎同时运行多个东西……我只想避免重新实例化jvm),什么是最好的解决方案?

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

    9 回复  |  直到 14 年前
        1
  •  4
  •   Alex Miller    15 年前

    让我想起 JSR 121 Isolates . 这个规范已经完成了,但是我不确定,如果有的话,这些东西在实现上是否发生过。有一个 followup JSR 284 也。

        2
  •  3
  •   martin clayton egrunin    14 年前

    你可以用 Ant Java task 在同一个JVM中运行多个Java应用程序-只需确保 fork 参数设置为 false (默认值)。链接的帮助页提供了一些示例。

        3
  •  1
  •   Tim    15 年前

    您最好的标准解决方案是在应用程序服务器中运行/部署应用程序。这是假设您正在处理一个应用程序,而应用程序服务器的开销并没有掩盖运行单个实例的优势。缺点是部署时间会很长。

    如果你只是想让小的Java应用程序启动得更快,那你就不太走运了。已经有一些尝试在实验性的jvm中实现这一点。其思想是,如果一个jvm正在运行,那么将类调用附加到这个正在运行的实例,而不是启动一个新的jvm。但据我所知,这些都不可能成为主流的JVM。

        4
  •  1
  •   Trevor Harrison    15 年前

    在我看来,问题是默认情况下,当你执行Java应用程序时,你会被一个入口点(即jar的主类,或者你在Java命令行上指定的任何东西)卡住,然后JVM终止。如果您从 BeanShell 命令行,您可以手动调用任意数量的命令。

    例如:

    java -cp bsh-2.0b4.jar;yourapp.jar bsh.Console
    

    然后,

    bsh % com.domain.prog.Mainclass.main( new String[] { } );
    
        5
  •  0
  •   Amir Afghani    15 年前

    RunTime.Exc方法创建一个本机进程并返回进程的子类的实例,该子类可用于控制进程并获取有关该进程的信息。类进程提供执行进程输入、执行进程输出、等待进程完成、检查进程退出状态和销毁(终止)进程的方法。

        6
  •  0
  •   jdigital    15 年前

    进程运行JVM;JVMs不运行进程(尽管它们可以启动进程,如前所述)。所以在同一个jvm下不可能有多个进程。

        7
  •  0
  •   Steve B.    15 年前

    如您所建议的,启动一个线程并加入以等待它结束,这将只是连续运行您的作业。我假设你只想同时运行多个东西。只需通过创建新线程或runnable来启动单独的线程。您只需编写一个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();
    }
    
        8
  •  0
  •   Sandro    15 年前

    您可以a.)将该类添加到类路径,然后导入/运行应用程序 或者沿着你正在寻找的路线,你可以使用类加载器/反射来加载类并找到它的主(String []ARGS)方法,然后调用它。

        9
  •  0
  •   Kathy Van Stone    15 年前

    甚至不需要线程依次运行多个其他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
            }
          }
       }
    }
    

    如果有任何程序调用 System.exit() ,但对于使用单个jvm的任何系统来说都是这样。