Java 以编程方式挂起/恢复JVM

Java 以编程方式挂起/恢复JVM,java,jvm,Java,Jvm,我有一个“主”java应用程序,它将在各自的JVM上启动另一个java应用程序。“主”应用程序最终将挂起、恢复或终止其他应用程序。限制:如果“主”应用程序死亡,其他应用程序仍必须运行 怎么做 我使用过JDI(java调试器接口),但是如果“主”应用程序结束,其他应用程序也会停止。您能编写其他应用程序来打开服务器套接字并通过它接受命令吗?设置一个理解“挂起”、“恢复”和“终止”的简单命令处理器是很容易的。孩子可以选择一个随机端口进行监听,并在启动时打印端口号,这样家长就可以轻松地获得该信息,然后通

我有一个“主”java应用程序,它将在各自的JVM上启动另一个java应用程序。“主”应用程序最终将挂起、恢复或终止其他应用程序。限制:如果“主”应用程序死亡,其他应用程序仍必须运行

怎么做


我使用过JDI(java调试器接口),但是如果“主”应用程序结束,其他应用程序也会停止。

您能编写其他应用程序来打开
服务器套接字并通过它接受命令吗?设置一个理解“挂起”、“恢复”和“终止”的简单命令处理器是很容易的。孩子可以选择一个随机端口进行监听,并在启动时打印端口号,这样家长就可以轻松地获得该信息,然后通过TCP连接与孩子联系。

正如您所说,我看到的唯一方法是使用JDI。但是,您可以尝试使用“远程调试”(通过TCP端口调试子JVM),而不是使用“本地调试”。这应该避免即使主JVM死亡,子JVM也会停止。

您可以尝试使用发出命令来启动其他应用程序(就像转到CLI并发出java something.jar命令一样)


然后还可以使用相同的方法杀死您启动的其他应用程序,但您可能需要掌握它们的进程id(pid),可能需要使用

我猜您指的是多线程应用程序。显而易见的解决方案是对线程进行子类化,并在线程中嵌入设置标志的功能

public void run() {
  while (keepRunning && notSuspended) {
     doNextItem(...);
  }
  while (notSuspended == false) {
     try {
       Thread.sleep(1000);
     } catch (InterruptedException e) {
       // do nothing but continue
     }
  }
}

public void suspend() {
  notSuspended = false;
}

public void resume() {
  notSuspended = true;
}

public void kill() {
  keepRunning = false;
}

其他从JVM内部捕获线程的解决方案也是可能的(比如使用JDI接口);但是,当线程受到外部干扰时,设计代码以保持一致状态实际上是不可行的。如果您想在线程暂停后实际验证程序状态是否正确一致,则最好采用将线程的其余部分内部化为一致状态的设计。

本节ds喜欢一种奇怪的设计。@coolbeans:不太奇怪,如果你考虑一下调试器或Java VisualVMtrue之类的应用程序,这是一个有效的用例。谢谢!我看到的问题是,接收此“命令”的线程将无法“挂起”其他线程…嗨@ernest:我不是其他应用程序的开发人员。理论上,可以要求“主”应用程序启动任何java应用程序。@edutesoy:当然可以,如果其他线程正在监视全局“挂起”要设置的标志。hi@edutesoy:目前我正在做类似的事情:
LaunchingConnector=findLaunchingConnector();映射参数=connectorArguments(connector,mainArgs);VirtualMachine vm=connector.launch(arguments);
an然后我使用vm挂起/恢复。如何将其切换为“远程调试”?我需要使用其他类型的连接器?tnxI不知道JDI的内部结构,但我知道这是可能的,因为像Eclipse这样的IDE能够通过TCP/IP调试远程JVM,当IDE死机时,远程应用程序继续工作。您可以重新连接以挂起它或其他任何东西。附加调试器不是有问题吗,至少挂起一个带有断点的线程,然后调试应用程序在恢复调试过的应用程序之前崩溃?挂起的线程在调试过的应用程序中不会仍然挂起吗?不,如果“调试器”崩溃,挂起的线程被恢复。JDI.hi@Hyangelo中没有僵尸。是的,正如你所说,我可以使用运行时启动其他应用程序,但我无法控制这些应用程序以挂起/恢复它们。进程界面非常差。是的,你可以,正如我在回答中所说,你必须使用PID.hi@edwin:我不使用独立线程,而是使用独立的JVM实例