Java 从ShutdownHook调用非静态方法
我需要从ShutdownHook调用一个非静态方法Java 从ShutdownHook调用非静态方法,java,events,static,Java,Events,Static,我需要从ShutdownHook调用一个非静态方法removeLocksOnExit()。 该方法在main所在的同一类中声明 大体上,我有以下代码: //final Thread mainThread = Thread.currentThread(); Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { // remove lock file... removeL
removeLocksOnExit()
。
该方法在main所在的同一类中声明
大体上,我有以下代码:
//final Thread mainThread = Thread.currentThread();
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
// remove lock file...
removeLocksOnExit();
}
});
Removelock()不能被衰减为静态,因此我不能直接从新线程调用它
但是,主类在windows关闭上包含一个操作listners,该操作也调用该方法。下面是代码的摘录:
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
if (exit() == 0) {
removeLocksOnExit();
log.info("END");
System.exit(0);
}
}
});
也许我可以从addShutdownHook启动windows关闭事件。这个函数将为我调用函数。(或为要缓存的目的创建特殊事件
是否可行?如果可行,您将如何启动该活动
为了更好地理解我的课堂结构:
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);
}
}
只需使用对添加关机挂钩的对象的引用。我假设不存在争用条件。如果存在争用条件,则添加使其线程安全所需的任何代码
class SomeClass {
void someMethod() {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
// remove lock file...
SomeClass.this.removeLocksOnExit();
}
});
}
}
创建主类的实例时,可以使用该对象调用removeLocksOnExit()
或者您可以在非静态方法中添加关闭钩子。您可以在构造函数中添加窗口关闭事件。也可以在那里添加关闭钩子
但是,请注意,Removelock方法可能会从不同的线程被调用两次。请注意,Removelock方法会在自身之后进行清理,并且是线程安全的。还要确保Removelock方法已准备好运行(即,它需要的所有变量都已初始化)在创建窗口侦听器或关闭挂钩之前。如果可以从在窗口关闭事件中调用的匿名内部类调用该方法,则可以从作为关闭挂钩的一部分调用的匿名内部类调用该方法。有什么问题使您认为您不能?这是一个异常吗?是cr吗吃掉对象并调用yourObject.removeLocksOnExit()是可行的吗?我尝试过…目标是这样的。remove…但我得到错误:“无法从IEPLC_工具对非静态方法remove…进行静态引用”您将相同的注释复制并粘贴到两个不同的答案上。此表单的工作原理是,它没有对removeLocksOnExit进行静态引用。它正在进行实例引用。我尝试了…问题是这样的。remove…但我得到错误:“无法对非静态方法进行静态引用从IEPLC_工具中删除…”
final MainClass object = new MainClass();
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
// remove lock file...
object.removeLocksOnExit();
}
});