Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从ShutdownHook调用非静态方法_Java_Events_Static - Fatal编程技术网

Java 从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

我需要从ShutdownHook调用一个非静态方法
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();
        }
    });