关闭挂钩在Eclipse中不起作用

uri*_*rir 25 java eclipse shutdown-hook

我添加了一个关闭钩子:

Runtime.getRuntime().addShutdownHook(myShutdownHook);
Run Code Online (Sandbox Code Playgroud)

它正常工作正常,但是当我单击Eclipse中的红色停止按钮时则不行.有没有办法在Eclipse中调用关闭钩子?

Zol*_*tán 17

红色停止按钮强行杀死应用程序,即不正常,因此JVM不知道应用程序正在退出,因此不会调用关闭挂钩.

不幸的是,没有办法(至少在Windows中)提供一种机制来确保始终调用钩子.这只是可以调用的东西,但不能保证.

  • 请引用一个来源引用"没有办法提供一种确保始终调用钩子的机制",因为页面http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime .html #addShutdownHook(java.lang.Thread)明确指出钩子**将在"程序正常退出"时运行,或"虚拟机响应用户/系统中断而终止". (2认同)
  • 这个,以及从Eclipse停止应用程序,是正常退出*的程序示例. (2认同)

Mar*_*ski 8

我用一个装饰的JavaProcess替换了一个hack:

    IProcess p = launch.getProcesses()[0];
    launch.addProcess(new JavaProcessDecorator(p));
    launch.removeProcess(p);
Run Code Online (Sandbox Code Playgroud)

装饰器覆盖终止功能.

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();
}}
Run Code Online (Sandbox Code Playgroud)

首先点击红色按钮,我向应用程序发送一条消息,要求轻轻终止.如果它不起作用,第二次点击红色按钮将杀死它.