Как вы изящно выходите из процесса в Java? - PullRequest
3 голосов
/ 27 ноября 2011

Я пытаюсь создать Java-программу, которая будет запускать несколько других не связанных Java-программ, в частности, сервер Minecraft.В настоящее время я пытаюсь изящно завершить процесс java.lang.Process.

Это код моей программы spawner: http://dl.dropbox.com/u/26746878/SpawnerSource/Main.java.txt

И это код дляпрограмма, которая порождается: http://dl.dropbox.com/u/26746878/SpawnerSource/Tester.java.txt

Что я делаю, так это запускаю мою программу spawner.Затем, через несколько секунд, я завершаю его с помощью Ctrl-C.Что я хочу увидеть, так это вывод моей программы «Завершение работы», за которым следует «Завершение».Я также хочу увидеть файл 'test.txt'.На самом деле я вижу только «Завершение работы», без «Ending» и «test.txt»

Я считаю, что проблема в том, что Process.destroy () принудительно завершает процесс, не позволяя запускать перехватчики завершения работы.

Есть ли альтернатива Process.destroy (), которая будет корректно завершать процесс (то есть: как если бы я нажал Ctrl-C)?

Ответы [ 2 ]

2 голосов
/ 27 ноября 2011

Вы никогда не должны разрушать рабочий процесс, поскольку он может привести к нестабильному состоянию всей ОС (поверьте, это вызвало у нас 2 часа простоя и стоило моей компании 10000 $ :() Вместо этого вы должны сделать это как @KaneКак уже упоминалось, отправьте запрос на отключение всем вашим дочерним процессам и дождитесь их завершения (каждый дочерний процесс отправляет уведомление RMI обратно основному процессу, прежде чем корректно завершить работу)

class ParentProcess{
  Map<int, CountDownLatch> finishSignals = new ConcurrentHashMap<int, CountDownLatch>();
  public void startProcess(){
    // Start child process
    // get its ID
    // and create a count down latch for it
    finishSignals.add(processId, new CountDownLatch(1));
  }
  public void shutDownProcess(processId){
    // Send an RMI request to process ID to shutdown
  }
  // RMI request sent from child process before stopping
  public void processFinishedNotification(processId){
    finishSignals[processId].countDown()
  }
  public void waitForChildsToFinish(){
    // This for loop will block until all child processes have sent a finish notification
    for(CountDownLatch childFinishSignal : finishSignals){
      childFinishSignal.await();
    }
  }
}
2 голосов
/ 27 ноября 2011

Возможно, вы захотите изучить удаленный вызов метода и попросить ваш процесс spawner попросить дочерние процессы отключить себя, вместо того чтобы процесс spawner уничтожил сами дочерние процессы.

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