我通过以下方式添加了一个关闭挂钩:
Runtime.getRuntime().addShutdownHook(myShutdownHook);
它可以正常工作,但是当我单击 Eclipse 中的红色停止按钮时就不行了。有没有办法在 Eclipse 中调用关闭挂钩?
我通过以下方式添加了一个关闭挂钩:
Runtime.getRuntime().addShutdownHook(myShutdownHook);
它可以正常工作,但是当我单击 Eclipse 中的红色停止按钮时就不行了。有没有办法在 Eclipse 中调用关闭挂钩?
红色的停止按钮强制终止应用程序,即不优雅,因此 JVM 不知道应用程序正在退出,因此不会调用关闭挂钩。
不幸的是,没有办法(至少在 Windows 中)提供一种机制来确保始终调用挂钩。它只是可以调用的东西,但不能保证。
我通过用装饰的 JavaProcess 替换 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();
}}
首先单击红色按钮,我向应用程序发送一条消息,要求轻轻终止。如果它不起作用,第二次单击红色按钮将杀死它。
我知道我参加聚会有点晚了,但我发现这个线程正在寻求帮助,其他人可能也会如此。
我们遇到了同样的问题,并使用Eclipse 插件(在 Linux 上)解决了这个问题,该插件现在提供了额外的停止按钮。我希望这对你们所有人都有帮助,也对我们有所帮助:)
红色停止按钮只是终止应用程序,根据 eclipse 开发人员的说法,他们对此无能为力,在 eclipse 错误跟踪器中看到这个问题。
@Pacerier - 来自 Javadoc:在极少数情况下,虚拟机可能会中止,也就是说,在没有完全关闭的情况下停止运行。当虚拟机在外部终止时会发生这种情况,例如在 Unix 上使用 SIGKILL 信号或在 Microsoft Windows 上使用 TerminateProcess 调用。如果本地方法出错,例如破坏内部数据结构或尝试访问不存在的内存,虚拟机也可能中止。如果虚拟机中止,则无法保证是否会运行任何关闭挂钩。
如果你只是想测试钩子是否工作,throw new RuntimeException()
从触发点开始。这甚至应该从 Eclipse 调用关闭挂钩。