Программно приостановить / возобновить JVM - PullRequest
2 голосов
/ 24 августа 2011

У меня есть «основное» Java-приложение, которое запускает другие Java-приложения, каждое из которых работает на своей собственной JVM.«Основное» приложение, в конце концов, приостановит, возобновит или уничтожит другие приложения.Ограничение: если «основное» приложение умирает, другие приложения все равно должны запускаться.

Как это сделать?

Я использовал JDI (интерфейс отладчика Java), но если «основное»приложение заканчивается, другие приложения также останавливаются.

Ответы [ 4 ]

2 голосов
/ 24 августа 2011

Единственный способ, которым я вижу, это, как вы говорите, использовать JDI. Но вместо использования «локальной отладки» вы можете попытаться использовать «удаленную отладку» (отладка дочерних JVM через порт TCP). Это должно предотвратить остановку детской JVM, даже если основная JVM умрет.

1 голос
/ 24 августа 2011

Не могли бы вы просто написать другие приложения, чтобы открыть ServerSocket и принимать команды поверх него?Было бы достаточно легко настроить простой командный процессор, который понимает «приостановить», «возобновить» и «убить».Дочерний может выбрать случайный порт для прослушивания и напечатать номер порта при запуске, чтобы родитель мог легко получить эту информацию, а затем связаться с дочерним устройством через TCP-соединение.

0 голосов
/ 24 августа 2011

Полагаю, вы говорите о многопоточном приложении.Очевидное решение состоит в том, чтобы разделить потоки на подклассы и внедрить возможность устанавливать флаги в потоке.

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).);однако на самом деле не представляется возможным разработать код для поддержания согласованного состояния, когда потокам мешают извне.Проект, который интернализует покой потока в согласованном состоянии, очень предпочтителен, если вы действительно хотите убедиться, что состояние программы правильно согласовано после приостановки потока.

0 голосов
/ 24 августа 2011

Вы можете попробовать использовать Runtime для выдачи команд для запуска других ваших приложений (как при переходе в CLI и при запуске команды javathing.jar.

Затем также используйте ту же самую вещьчтобы убить другие приложения, которые вы запустили, но вам, вероятно, нужно узнать их идентификатор процесса (pid), возможно, используя this

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...