为什么Firefox会在20秒后终止我的applet?

时间:2010-08-31 11:34:04

标签: java firefox applet

我在这样的网页上有一个简单的小程序。 (这是一个从更复杂的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会以这种方式终止吗?

3 个答案:

答案 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方法中,该方法不应该有任何超时。

来自Javadoc init()

  

Applet的子类应该覆盖   这个方法如果有初始化   去表演。例如,一个applet   使用线程将使用init方法   创建线程和销毁   杀死他们的方法。

我猜你需要长时间运行初始化,因此你应该在init()方法中为它启动一个线程。

答案 2 :(得分:1)

有错误 firefox

我发现的唯一解决方案是使用小于1.6_21的java。从1.6_21开始,firefox 3.0和3.6被破坏了。幸运的是一切都应该在firefox 4中运行。