为什么这个applet有一个销毁方法?


2

我一直在尝试通过研究"Welcome to HotJava" applet的代码来了解applet。我反编译使用Jad Windows版本的* .class文件,我看到下面的代码行

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我看不出有什么更多的鼠标事件可以听。 22 2月. 092009-02-22 01:50:11

  0

只是扩大我的答案,以回应你的评论中的问题。 22 2月. 092009-02-22 02:09:47


1

的destroy()方法是至关重要的,如果你想留下任何“证据”,你的小应用程序曾经运行...

例如,你可以把你所有的状态信息保存到文件或进行后续的服务器使用或让服务器知道您正在断开连接。

试想一下,你有一个聊天应用程序...

  0

我想我使用了一个误导性的标题。我明白为什么你需要这种方法(即清理),但我更多地询问这个特定的情况。 22 2月. 092009-02-22 01:36:28


1

它可用于释放applet上下文外部的资源。假设您已从外部服务器端应用程序获取资源,如许可证。或者,您可能需要通知某些服务器端资源,指出应用程序因为统计信息或其他原因已关闭。

  0

查看我对Uri的评论。 22 2月. 092009-02-22 01:37:41


0

那么,不是在这特别是的情况。但是,在java中删除鼠标(和其他)侦听器是一种很好的做法 - 不这样做会导致不幸的内存泄漏。

对于您的destroy()来说,清理所有init()所做的一切也是很好的做法,即使它不是必需的。