Java在applet重新加载中杀死守护进程线程

时间:2011-04-20 09:25:49

标签: java applet daemon

我知道当没有其他非守护程序线程处于活动状态时,所有守护程序线程都应该被杀死。 我正在开发从静态对象获取数据的applet。这些静态对象正在守护程序线程中从远程服务器下载一些数据。几个小程序可以访问相同的数据,因此在每个小程序的运行线程中没有任何意义。 问题是我重新加载页面。 Applet正在重新加载,它们在那些静态对象中注册,除了JVM杀死守护进程线程之外,一切都会好的。

也许我一步一步解释:

  1. Applet正在加载,它在静态对象中注册,提供数据。
  2. 静态对象启动守护程序线程。
  3. 页面重新加载。
  4. Applet正在卸载(调用stop()和destroy())
  5. 正在创建新的applet实例,并在静态对象中注册。
  6. JVM在守护程序线程中抛出ThreadDeath并停止通信。
  7. 在我看来,第6步应该是在4之后和5之前。 我错过了什么吗?

    我开发的解决方法是在注册静态对象之前休息一段时间让JVM杀死守护进程,然后自动创建守护进程,但它只是一种解决方法。有没有更好的解决方案?

2 个答案:

答案 0 :(得分:0)

为什么不在stop()destroy()中终止守护程序线程以使事情更加清晰。

答案 1 :(得分:0)

我不鼓励在applet之间共享后台线程,但如果你坚持,那么你可以做到以下几点:

您可以通过重写Thread.setDefaultUncaughtExceptionHandler来捕获ThreadDeath,以确保不会错过它。 然后,您可以从该处理程序重新启动一个新的deamon线程来替换被杀死的一个。

你应该确保你不在后台线程中使用synchronized对共享成员,因为你的线程可以在同步块的中间停止,如Thread.stop所述(Java插件使用Thread.stop来杀死)你的主题)。

请注意,如果您在2个不同的标签页中至少打开了2个小程序,则重新加载一个小程序不会使JVM终止您的主题。 守护程序标志似乎在applet环境中没有任何影响。