2011-04-20 146 views
1

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

也许我一步解释步骤:

  1. Applet是装载和它在静态对象,它提供数据寄存器。
  2. 静态对象启动守护进程线程。
  3. 页面重新加载。
  4. 小程序正在卸载(stop()和destroy()被调用)
  5. 新的applet实例正在创建并在静态对象中注册。
  6. JVM在守护程序线程中抛出ThreadDeath,通信停止。

在我看来,第6步应该是在4之前和之前5. 我是否错过了什么?

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

回答

0

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

+0

因为可以有另一个applet实例或其他对象等待来自服务器的数据。问题在于当守护进程被JVM杀死的时候不是为什么。 – BeginEnd 2011-04-20 10:04:44

0

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

您可以通过覆盖Thread.setDefaultUncaughtExceptionHandler到一定不要错过它捕获ThreadDeath。 然后,您可以从该处理程序重新启动一个新的deamon线程来替换死亡的线程。

您应该确保不要在后台线程的共享成员上使用同步,因为您的线程可以在同步块的中间停止,如Thread.stop所记录(Java插件使用Thread.stop杀死你的线程)。

请注意,如果您在2个不同的选项卡中打开了至少2个小程序,重新加载一个不会使JVM杀死您的线程。 守护程序标志在applet环境中似乎没有任何影响。