Подтвердить что ты не робот

Ключ завершения работы не работает в Eclipse

Я добавил завершение загрузки через:

Runtime.getRuntime().addShutdownHook(myShutdownHook);

Он нормально работает нормально, но не тогда, когда я нажимаю кнопку красной остановки в Eclipse. Есть ли способ заставить крюк остановки вызывать в Eclipse?

4b9b3361

Ответ 1

Красная кнопка остановки принудительно убивает приложение, то есть не изящно, поэтому JVM не знает, что приложение выходит из строя, поэтому крючки отключения не вызываются.

К сожалению, нет способа (в Windows, по крайней мере) предоставить механизм, который гарантирует, что hook всегда вызывается. Это просто то, что может быть вызвано, но нет гарантии.

Ответ 2

Я сделал взлом, заменив JavaProcess на украшенный:

    IProcess p = launch.getProcesses()[0];
    launch.addProcess(new JavaProcessDecorator(p));
    launch.removeProcess(p);

И декоратор - это основная функция завершения.

public class JavaProcessDecorator implements IProcess {

private IProcess p;

public JavaProcessDecorator(IProcess p) {
    this.p = p;
}

private boolean sigkill = false;

@SuppressWarnings("rawtypes")
@Override public Object        getAdapter(Class arg)                { return p.getAdapter(arg); }
...
@Override public ILaunch       getLaunch()                          { return p.getLaunch(); }
@Override public IStreamsProxy getStreamsProxy()                    { return p.getStreamsProxy(); }
@Override public void          setAttribute(String s1, String s2)   {        p.setAttribute(s1, s2); }
@Override public void          terminate() throws DebugException    {
    if(!sigkill) {
        try {
            IDebugIService cs = DirmiServer.INSTANCE.getRemote("main", IDebugIService.class);
            if(cs != null) cs.modelEvent(new TerminateRequest());
        } catch (RemoteException e) { }
        this.sigkill = true;
    } else p.terminate();
}}

Сначала нажмите на красную кнопку, я отправлю сообщение в заявку с просьбой о мягком завершении. Если он не работает, второй щелчок на красной кнопке убьет его.

Ответ 3

Невозможно обойти проблему, используя:

 if (Boolean.parseBoolean(System.getenv("RUNNING_IN_ECLIPSE")) == true) {
                System.out.println("You're using Eclipse; click in this console and     " +
                                                "press ENTER to call System.exit() and run the shutdown routine.");
                try {
                        System.in.read();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                System.exit(0);
        }

Пожалуйста, обратитесь к Как получить завершающий крючок для запуска процесса, запущенного из Eclipse

Ответ 4

Я знаю, что немного опаздываю на вечеринку, но я нашел эту нить, ищущую помощь, и, возможно, другие.

У нас была такая же проблема и она была решена с помощью плагина Eclipse (в Linux), который теперь предоставляет дополнительные кнопки остановки. Надеюсь, это послужит вам всем, а также поможет нам:)

Ответ 5

Красная кнопка остановки просто завершает работу приложения, и, согласно разработчикам eclipse, они ничего не могут с этим поделать, посмотрите эту проблему в eclipse bug tracker.

Ответ 6

@Pacerier - из Javadoc: в редких случаях виртуальная машина может прервать работу, то есть прекратить работу, не закрывая ее полностью. Это происходит, когда виртуальная машина завершается извне, например, с сигналом SIGKILL в Unix или вызовом TerminateProcess в Microsoft Windows. Кроме того, виртуальная машина может прервать работу, если родной метод пойдет наперекосяк, например, повреждая внутренние структуры данных или пытаясь получить доступ к несуществующей памяти. Если виртуальная машина прерывается, тогда не может быть никакой гарантии о том, будут ли выполняться какие-либо выключения.

Ответ 7

Если вы просто хотите проверить, работает ли крючок или нет, throw new RuntimeException() из точки запуска. Это должно вызывать крюк остановки даже из Eclipse.