Как сделать программу на Java, которую нельзя убить из командной строки?

Я пытаюсь запустить программу Java, которая, кажется, имеет "9 жизней". Он просто выводит в бесконечном цикле следующее, когда мы его запускаем:

GlobalVar = 1
GlobalVar = 1
GlobalVar = 1
/* etc */
GlobalVar = 1
GlobalVar = 1

Затем, когда мы CTRL+C и убить программу, вместо того, чтобы выходить из нее и переходить в командную строку... она должна продолжаться заново следующим образом:

GlobalVar = 2
GlobalVar = 2
GlobalVar = 2

И снова и снова, он должен снова открыть с GlobalVar установить 3, 4, 5 и т. д.

Во-первых, я знаю, что этот код немного непрактичен - он предназначен только для академических занятий. Но я учу Java.

Вот мой код до сих пор:

import java.io.*;
public class SHTest {  

            static int globalVar = 0;

 public static void main ( String[] args ) throws  IOException  , InterruptedException {

        System.out.println ("The Global Var is " + globalVar);
        Runtime.getRuntime ().addShutdownHook ( new Thread () {
            @Override
            public void run () {

            globalVar += 1;
 /* shutdown */
           String[] command = {"C://Program Files//Java//jdk1.7.0_02//bin//java.exe", "SHTest"};  //args[0] ... CreateTexts
           ProcessBuilder pb = new ProcessBuilder(command);
           pb.redirectErrorStream(true);

           try {
               Process exec = pb.start(); 
               BufferedReader br = new BufferedReader(new InputStreamReader(exec.getInputStream()));
               String text = null;
           while ((text = br.readLine()) != null) {
               System.out.println(text);
           }

           System.out.println("Process exited with " + exec.waitFor());
           } 

            catch(IOException io) { }

            catch(InterruptedException inter) { }


            }
        } );  //end addShutdownHook() 

        //int copyGlobalVar = globalVar;
        while ( true  ) {
            System.out.println ( "Looping " + globalVar );
            Thread.sleep ( 800 );
        }
    }


    }

Ссылка:

Захват SIGINT в Java

Почему я не могу повторно выполнить программу Java из блока исключений?

метод addShutdownHook

ПРИМЕЧАНИЕ. Я открыт для использования пакетных файлов Windows, поскольку JVM, похоже, имеет свои ограничения в этих вещах. Или другие инструменты тоже. Даже для ОС Linux, было бы хорошо

2 ответа

Решение

Статическая переменная globalVar не переживет разрушение и воссоздание процесса. В новом процессе он будет повторно инициализирован до 0. Он должен быть передан в качестве параметра процессу, и globalVar затем следует инициализировать значением этого аргумента.

Runtime.getRuntime ().addShutdownHook вызывается до того, как JVM останавливает программу, но не мешает ее остановить.

Если вы хотите перехватить сигналы SIGINT, вам нужно использовать SignalHandler (sun.misc.SignalHandler) в Unix, а также в Windows. Смотрите эту статью (pdf, стр. 8 и 9).

Вот простой пример того, как его использовать:

Signal.handle(new Signal("INT"), new SignalHandler () {
  public void handle(Signal sig) {
    if (globalVar == 9) {
      System.out.println("9 lifes consumes, program will shutdown");
      System.exit();
    }
    System.out.println(globalVar + " lifes consumed, one more will be consumed");
    // increment your score here
  }
});

Источник: этот пост.

Другие вопросы по тегам