Как отменить System.Exit и перезапустить приложение в Java - PullRequest
1 голос
/ 21 февраля 2011

Для приложения мне нужно перезапустить основной класс / функцию приложения.

Итак, каков наилучший способ обнаружить выход приложения по определенному коду, а затем перезапустить себя?

Ответы [ 4 ]

1 голос
/ 21 февраля 2011

Лучший способ сделать это - реализовать логику перезапуска в модуле запуска или скрипте-обёртке.

Я почти уверен, что невозможно осуществить полный перезапуск JVM на чистой Java в собственной JVM приложения. И ничего кроме полного перезапуска JVM не требуется для таких вещей, как:

  • изменить параметры JVM (например, размер кучи),
  • убрать утечки или
  • избавиться от потоков Java, которые не отвечают на Thread.interrupt().
1 голос
/ 21 февраля 2011

Вы должны использовать метод Runtime.getRuntime().addShutdownHook().

Но будьте осторожны: поскольку вы говорите, что хотите перезапустить основной метод в System.exit, возможно, вы вводите возможность попасть в бесконечный цикл.

0 голосов
/ 26 апреля 2014

finally действует как деструктор, поэтому мы можем перезапустить приложение, как это.Предупреждение: finally плохая замена для финализации, а также не является надлежащим деструктором.

public class RestartDemo
{
    public void oddeven(int x)
    {
        if(x % 2 != 0)
        {
            try
            {
                this.restart();
            }
            catch(Exception e)
            { 
                 //do nothing
            }
        }
        else
        {
            System.out.println(x + " is even");
        }
    }

    public void restart()throws Exception
    {
        try
        {
            throw new Exception("Force restart!");
        }
        finally
        {
            RestartDemo.main(new String[0]);
        }
    }

    public static void main(String args[])
    {
        RestartDemo r = new RestartDemo();
        r.oddeven((int)(Math.random() * 100));
    }
}
0 голосов
/ 21 февраля 2011

Почему бы не встроить ваш так называемый метод main в метод main Launcher?

Ваш класс запуска использует SecurityManager, который запрещает вызовы System.exit.Таким образом, когда первоначальное обслуживание завершается, генерируется исключение SecurityException (и перехватывается в Launcher).Затем программа запуска перезапускает исходную главную.

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