2011-08-31 88 views
1

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

在主我有以下代码:

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

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

主类包含但在窗口关闭的行动列表,也调用该方法。这里是代码的摘录:

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

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

也许我可以从addShutdownHook那么触发窗口关闭事件。而这个会调用我前面的函数。 (或创建为宗旨,以缓存的特别活动......

是否可行?如果是的话你会如何触发事件?

有一个更好的了解,这里是我的类的结构:

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

如果您可以从窗口关闭事件调用的匿名内部类中调用该方法,则可以从作为关闭钩子一部分调用的匿名内部类调用该方法。有什么问题让你觉得你不能?这是一个例外吗? – parsifal

+0

创建对象并调用yourObject.removeLocksOnExit()是否可行? –

+0

等待...我重组了一下代码...也许会更容易理解...给我2分钟: – Stefano

回答

1

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

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

0

使用时只需将参考其中添加了关闭挂钩对象我做一个假设没有竞争条件。如果有,再加入你需要的任何代码,使其线程安全

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

我试过......最粗略的是this.remove ......但我得到的错误:“无法对非静态方法删除静态引用...”从IEPLC_Tool“ – Stefano

1

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

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

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

+0

我试过... ... obljest会this.remove ...但我得到的错误:”不能静态引用非静态方法删除...从IEPLC_Tool“ – Stefano

+0

您复制并将相同的评论粘贴到两个不同的答案上。这个表单可以工作,因为它并没有对它做一个实例引用的removeLocksOnExit静态引用。 – Dev

相关问题