【问题标题】:Shutdown hook doesn't work in Eclipse [duplicate]关闭挂钩在 Eclipse 中不起作用 [重复]
【发布时间】:2012-10-11 09:37:01
【问题描述】:

我已通过以下方式添加了shutdown hook

Runtime.getRuntime().addShutdownHook(myShutdownHook);

它可以正常工作,但是当我单击 Eclipse 中的红色停止按钮时就不行了。有没有办法在 Eclipse 中调用关闭挂钩?

【问题讨论】:

  • 这些问题被标记为与 2 年后提出的问题重复
  • 实际上另一个是两年前(09 而不是 11)。您可能误读了这一年的第 (13) 天。

标签: java eclipse shutdown-hook


【解决方案1】:

红色的停止按钮强制终止应用程序,即不优雅,因此 JVM 不知道应用程序正在退出,因此不会调用关闭挂钩。

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

【讨论】:

  • 请引用来源引用“没有办法提供确保始终调用挂钩的机制”,因为页面docs.oracle.com/javase/7/docs/api/java/lang/…明确指出挂钩当“程序正常退出”或“虚拟机响应用户/系统中断而终止”时运行。
  • @Pacerier 该语句基于我所做的一个测试,我关闭了一个控制台窗口,该窗口正在运行一个调用 Java 应用程序的批处理脚本。关闭窗口时,未调用关闭挂钩。
  • 这以及从 Eclipse 中停止应用程序是程序未正常退出的示例。
【解决方案2】:

我通过用修饰的 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();
}}

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

【讨论】:

    【解决方案3】:

    我知道我参加聚会有点晚了,但我发现这个帖子正在寻求帮助,其他人可能也会这样。

    我们遇到了同样的问题,并通过 Eclipse plugin(在 Linux 上)解决了它,它现在提供了额外的停止按钮。 我希望这对你们所有人都有帮助,也对我们有所帮助:)

    【讨论】:

    • 可以通过帮助菜单中的 Eclipse Marketplace 轻松安装(链接包含手动下载和安装的说明,我遇到了一些错误)
    【解决方案4】:

    红色停止按钮只是终止应用程序,根据 Eclipse 开发人员的说法,他们对此无能为力,请参阅 Eclipse 错误跟踪器中的 issue

    【讨论】:

      【解决方案5】:

      @Pacerier - 来自 Javadoc:在极少数情况下,虚拟机可能会中止,即在没有完全关闭的情况下停止运行。当虚拟机在外部终止时会发生这种情况,例如在 Unix 上使用 SIGKILL 信号或在 Microsoft Windows 上使用 TerminateProcess 调用。如果本地方法出错,例如破坏内部数据结构或尝试访问不存在的内存,虚拟机也可能中止。如果虚拟机中止,则无法保证是否会运行任何关闭挂钩。

      【讨论】:

        【解决方案6】:

        如果你只是想测试钩子是否工作,从触发点throw new RuntimeException()。这甚至应该从 Eclipse 调用关闭挂钩。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-22
          • 2021-07-19
          • 2016-12-09
          相关资源
          最近更新 更多