以编程方式挂起/恢复JVM

时间:2011-08-24 15:39:16

标签: java jvm

我有一个"主要" java应用程序将在其自己的JVM上启动另一个java应用程序。 "主要"应用程序最终会暂停,恢复或终止其他应用程序。限制:如果"主要"应用程序死亡,其他应用程序仍必须运行。

怎么做?

我使用过JDI(java调试器界面)但是如果" main"应用程序结束,其他应用程序也停止。

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您是否可以编写其他应用程序来打开ServerSocket并接受命令?设置一个理解“暂停”,“恢复”和“杀死”的简单命令处理器就很容易了。孩子可以选择一个随机端口来监听,并在启动时打印端口号,这样父母就可以轻松获取该信息,然后通过TCP连接联系孩子。

答案 2 :(得分:-1)

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

然后也使用相同的东西来杀死你启动的其他应用程序,但你可能需要掌握他们的进程ID(pid),可能使用this

答案 3 :(得分:-1)

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

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接口);但是,当线程受到外部干扰时,设计代码以维持一致状态是不可行的。如果要在线程暂停后实际验证程序状态是否正确一致,那么将线程的静止内部化为一致状态的设计是首选。