我知道当没有其他非守护程序线程处于活动状态时,所有守护程序线程都应该被杀死。 我正在开发从静态对象获取数据的applet。这些静态对象正在守护程序线程中从远程服务器下载一些数据。几个小程序可以访问相同的数据,因此在每个小程序的运行线程中没有任何意义。 问题是我重新加载页面。 Applet正在重新加载,它们在那些静态对象中注册,除了JVM杀死守护进程线程之外,一切都会好的。
也许我一步一步解释:
在我看来,第6步应该是在4之后和5之前。 我错过了什么吗?
我开发的解决方法是在注册静态对象之前休息一段时间让JVM杀死守护进程,然后自动创建守护进程,但它只是一种解决方法。有没有更好的解决方案?
答案 0 :(得分:0)
为什么不在stop()
或destroy()
中终止守护程序线程以使事情更加清晰。
答案 1 :(得分:0)
我不鼓励在applet之间共享后台线程,但如果你坚持,那么你可以做到以下几点:
您可以通过重写Thread.setDefaultUncaughtExceptionHandler来捕获ThreadDeath,以确保不会错过它。 然后,您可以从该处理程序重新启动一个新的deamon线程来替换被杀死的一个。
你应该确保你不在后台线程中使用synchronized对共享成员,因为你的线程可以在同步块的中间停止,如Thread.stop所述(Java插件使用Thread.stop来杀死)你的主题)。
请注意,如果您在2个不同的标签页中至少打开了2个小程序,则重新加载一个小程序不会使JVM终止您的主题。 守护程序标志似乎在applet环境中没有任何影响。