我需要从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);
}
}
答案 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();
}
});
}
}