从ShutdownHook调用非静态方法

时间:2011-08-31 11:59:56

标签: java events static

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

在主要内容中我有以下代码:

//final Thread mainThread = Thread.currentThread();
Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        // remove lock file...
        removeLocksOnExit();
    }
});

removeLocks()不能被解除静态,因此我可以直接从新线程中调用它。

主类包含但是关闭窗口的动作列表器也会调用该方法。以下是代码的摘录:

addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
        if (exit() == 0) {
            removeLocksOnExit();
            log.info("END");

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

也许我可以从addShutdownHook触发Windows关闭事件。而这个人会把这个功能称为我。 (或者为了缓存目的而创建一个特殊事件......

可行吗?如果是的话你会怎么解雇这个事件?

更好地理解这是我班级的结构:

public class IEPLC_Tool 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 IEPLC_Tool inst = new IEPLC_Tool(args);

IEPLC_Tool(String[] args) {
        super(CustomPathModel.IEPLC_TITLE);
        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();
        addFesaToolActionListener(this);
    }
}

3 个答案:

答案 0 :(得分:1)

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

    final MainClass object = new MainClass();
    Runtime.getRuntime().addShutdownHook(new Thread() {
        @Override
        public void run() {
            // remove lock file...
            object.removeLocksOnExit();
        }
    });

或者您可以使用非静态方法添加ShutdownHook。

答案 1 :(得分:1)

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

但是,

请注意,可能会从不同的线程调用removeLocks方法两次。小心它自己清理后,它是线程安全的。还要确保removeLocks方法已准备好运行(即,它所需的所有变量已经初始化)之前创建窗口侦听器或关闭钩子。

答案 2 :(得分:0)

只需使用对添加关闭挂钩的对象的引用即可。我假设没有竞争条件。如果有,那么添加你需要的任何代码以使其线程安全。

class SomeClass {
    void someMethod() {
        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
               // remove lock file...
               SomeClass.this.removeLocksOnExit();
            }
        });
    }
}