2011-08-31 87 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

相關問題