首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ShutdownHook调用非静态方法

从ShutdownHook调用非静态方法
EN

Stack Overflow用户
提问于 2011-08-31 19:59:56
回答 3查看 1.3K关注 0票数 1

我需要从ShutdownHook中将该方法称为非静态方法removeLocksOnExit()。该方法在main所在的同一个类中声明。

大体上,我有以下代码:

代码语言:javascript
复制
//final Thread mainThread = Thread.currentThread();
Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        // remove lock file...
        removeLocksOnExit();
    }
});

removeLocks()不能是静态的,因此我不能直接从新线程中调用它。

不过,main类包含了一个动作监听器,它会在关闭窗口时调用该方法。以下是代码的摘录:

代码语言:javascript
复制
addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
        if (exit() == 0) {
            removeLocksOnExit();
            log.info("END");

            System.exit(0);
        }
    }
});

也许我可以从addShutdownHook触发窗口关闭事件。这个人将为我调用函数。(或者创建一个用于缓存的特殊事件...

这可行吗??如果是,您将如何触发该事件??

为了更好地理解我的类的结构:

代码语言:javascript
复制
public class MyTool extends JFrame{

removeLocksOnExit(){
....
...
}

 public static void main(String[] args) {
...............
.........
    //final Thread mainThread = Thread.currentThread();
    Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
            // remove lock file...
            removeLocksOnExit();
        }
    });
}

final MyTool inst = new MyTool(args);

MyTool(String[] args) {
        super(CustomPathModel.MyTITLE);
        setResizable(false); // FIXME find a way to auto size inner xml-editor
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                if (exit() == 0) {
                    removeLocksOnExit();
                    log.info("END");

                    System.exit(0);
                }
            }
        });

        setLookFeel();
        initAdminStatus();
        initGUI();
        addToolActionListener(this);
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-31 20:20:50

您可以在构造函数中添加窗口关闭事件。在那里也添加关闭钩子。

但是要注意,removeLocks方法可能会从不同的线程被调用两次。注意,它会自动清理,并且是threadsafe。在创建窗口侦听器或关闭钩子之前,还要确保removeLocks方法已准备好运行(即,它所需的所有变量都已初始化)。

票数 1
EN

Stack Overflow用户

发布于 2011-08-31 20:11:06

创建主类的实例时,可以使用该对象调用removeLocksOnExit()

代码语言:javascript
复制
    final MainClass object = new MainClass();
    Runtime.getRuntime().addShutdownHook(new Thread() {
        @Override
        public void run() {
            // remove lock file...
            object.removeLocksOnExit();
        }
    });

或者,您可以在非静态方法中添加ShutdownHook。

票数 1
EN

Stack Overflow用户

发布于 2011-08-31 20:08:10

只需使用对添加关闭钩子的对象的引用。我做了一个假设,没有竞争条件。如果有,则添加您需要的任何代码以使其线程安全。

代码语言:javascript
复制
class SomeClass {
    void someMethod() {
        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
               // remove lock file...
               SomeClass.this.removeLocksOnExit();
            }
        });
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7256620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档