2009-02-22 59 views
2

我一直在嘗試通過研究"Welcome to HotJava" applet的代碼來了解applet。我反編譯使用Jad Windows版本的* .class文件,我看到下面的代碼行爲什麼這個applet有一個銷燬方法?

public void init() { 
    // Skip some lines... 
    addMouseListener(this); 
} 

public void destroy() 
{ 
    removeMouseListener(this); 
} 

是destroy方法真的有必要嗎?爲什麼該applet如果即將結束,需要將其自身作爲鼠標監聽器來移除?

回答

1

destroy()方法清理資源,這樣他們就可以被釋放。當整個JVM關閉時,在關閉之前釋放所有資源並不重要,但即使並非絕對必要,做正確的事情總是一個好主意。

根據線程模型的不同,如果您將自己留作鼠標偵聽器,那麼如果發生鼠標事件,您仍會收到通知。如果在同一個JVM中有多個Applets,並且只有一個Applet結束,那麼如果留下一個不採取任何操作的偵聽器,則可以讓線程處於滑稽狀態。這樣做可能會鎖定其他Applets。

編輯:

通過一個有趣的狀態的線程,我的意思是(例如)如果一個監聽其小程序線程停止是排隊消息隊列中,沒有人是從閱讀,那麼最終將隊列填滿並且分派線程會阻塞。 (更詳細地說,讓我們假設偵聽器只做隊列消息,並且Applet中有一個線程 - 現在停止 - 從這個隊列中讀取,一旦隊列填滿,它將阻塞!)

使用鼠標監聽器,具體來說,您可能很安全,假設Applet退出時它不再可見並且不能再接收鼠標事件。然而,如果有不同的聽衆,你可能會陷入困境。總是做正確的事情,即使它不是真正必要的,也會讓你養成這種習慣,所以當它實際上非常重要時,你不要忘記做正確的事情。 :)

+0

這個答案非常接近我正在尋找的東西。它提到了一些我不知道的東西:可能有1個applet/JVM,而沒有清理可能會影響其他人。但是我仍然想知道線程怎麼會最終「處於一個滑稽的狀態」,B/C我看不出有什麼更多的鼠標事件可以聽。 – allyourcode 2009-02-22 01:50:11

+0

只是擴大我的答案,以迴應你的評論中的問題。 – Eddie 2009-02-22 02:09:47

1

的destroy()方法是至關重要的,如果你想留下任何「證據」,你的小應用程序曾經運行...

例如,你可以把你所有的狀態信息保存到文件或進行後續的服務器使用或讓服務器知道您正在斷開連接。

試想一下,你有一個聊天應用程序...

+0

我想我使用了一個誤導性的標題。我明白爲什麼你需要這種方法(即清理),但我更多地詢問這個特定的情況。 – allyourcode 2009-02-22 01:36:28

1

它可用於釋放applet上下文外部的資源。假設您已從外部服務器端應用程序獲取資源,如許可證。或者,您可能需要通知某些服務器端資源,指出應用程序因爲統計信息或其他原因已關閉。

0

那麼,不是在這特別是的情況。但是,在java中刪除鼠標(和其他)偵聽器是一種很好的做法 - 不這樣做會導致不幸的內存泄漏。

對於您的destroy()來說,清理所有init()所做的一切也是很好的做法,即使它不是必需的。

相關問題