我在这样的网页上有一个简单的小程序。 (这是一个从更复杂的applet中删除的测试用例)。
package test;
import java.applet.Applet;
@SuppressWarnings("serial")
public class SimpleLoopApplet extends Applet
{
public void init()
{
System.out.println("SimpleLoopApplet invoked");
try
{
while (true)
{
try
{
System.out.println("Sleep for 1 second");
Thread.sleep(1000);
}
catch (InterruptedException e)
{
System.out.println("Applet thread interrupted while sleeping");
}
}
}
finally {}
}
}
在一台计算机上的Firefox 3.6.8上,此applet将运行20秒然后突然退出,就像VM正在终止一样(java控制台将消失; Java图标将保留在系统托盘中,直到我将鼠标悬停在它上面;永远不会达到finally块。
一直持续20秒。从上面的代码打印20“睡眠1秒钟”,如果我将睡眠时间延长到5秒,则在终止前打印4条消息。
在同一台计算机上的IE和Chrome中,循环将无限期地继续,就像在另一台计算机上的Firefox 3.6.8中一样。
有人可以建议为什么applet会以这种方式终止吗?
答案 0 :(得分:4)
来自applet tutorial
初始化方法
init方法对于一次性非常有用 初始化不需要很多 长。通常是init方法 包含你想要的代码 通常放入构造函数。该 原因小程序通常没有 建设者是他们不是 保证有一个完整的环境 直到他们的init方法被调用。 保持init方法简短,以便 你的applet可以快速加载。
启动方法
之后执行任务的每个applet 初始化(直接除外) 响应用户操作)必须 覆盖start方法。开始 方法开始执行 小程序。回归是一种好习惯 快速从一开始的方法。如果你 需要进行计算 它可能是密集的行动 最好为此启动一个新线程 目的
看起来你必须为长时间运行的方法创建自己的线程。
答案 1 :(得分:1)
Can anyone suggest why the applet might terminate in this way?
我没有找到一个官方参考,但它看起来像初始化的超时。 您可以将代码放在start方法中,该方法不应该有任何超时。
Applet的子类应该覆盖 这个方法如果有初始化 去表演。例如,一个applet 使用线程将使用init方法 创建线程和销毁 杀死他们的方法。
我猜你需要长时间运行初始化,因此你应该在init()方法中为它启动一个线程。
答案 2 :(得分:1)
有错误 firefox
我发现的唯一解决方案是使用小于1.6_21的java。从1.6_21开始,firefox 3.0和3.6被破坏了。幸运的是一切都应该在firefox 4中运行。