【问题标题】:Why does Firefox terminate my applet after 20 seconds?为什么 Firefox 会在 20 秒后终止我的小程序?
【发布时间】:2010-08-31 11:34:03
【问题描述】:

我在这样的网页上有一个简单的小程序。 (这是一个从更复杂的小程序中删减的测试用例)。

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 上,此小程序将运行 20 秒然后突然退出,就好像 VM 正在终止一样(Java 控制台将消失;Java 图标将保留在系统托盘中,直到我将鼠标悬停在它上面; finally 块永远不会到达)。

始终是 20 秒。从上面的代码中打印了 20 个“睡眠 1 秒”,如果我将睡眠时间延长到 5 秒,那么在终止之前会打印 4 条消息。

在同一台计算机上的 IE 和 Chrome 中,循环将无限期地继续下去,就像在另一台计算机上的 Firefox 3.6.8 中一样。

谁能说明为什么小程序会以这种方式终止?

【问题讨论】:

  • 感谢 josefx 和 stacker,他们提供了几乎相同且基本正确的答案。 FWIW,将循环放入 start 而不是 init 没有区别,但创建一个单独的线程确实解决了问题。

标签: java firefox applet


【解决方案1】:

来自小程序tutorial

初始化方法

init方法对一次性有用 不需要很长时间的初始化 长。 init 方法通常 包含您想要的代码 通常放入构造函数中。这 小程序通常没有的原因 构造函数是他们不是 保证有一个完整的环境 直到他们的 init 方法被调用。 保持 init 方法简短,以便 您的小程序可以快速加载。

启动方法

之后执行任务的每个小程序 初始化(除了直接 响应用户操作)必须 覆盖启动方法。开始 方法开始执行 小程序。返回是个好习惯 快速从方法入手。如果你 需要计算执行 可能是密集的操作 最好为此启动一个新线程 目的。

看起来您必须为长时间运行的方法创建自己的线程。

【讨论】:

    【解决方案2】:
    Can anyone suggest why the applet might terminate in this way?
    

    我还没有找到官方参考,但它看起来像是初始化超时。 您可以将代码放在不应有任何超时的 start 方法中。

    来自Javadoc init()

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

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

    【讨论】:

      【解决方案3】:

      on 有错误 firefox.

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

      【讨论】:

      • 感谢您指出这一点。自从我为长时间运行的进程添加了一个单独的线程以来,我没有遇到任何问题。幸运的是(我认为!)官方,我只需要支持 IE 7 和 8。
      • 我们的情况更糟,因为我们公司只支持 Firefox。现在我们只告诉我们的客户安装较低版本的 java 并等待 firefox 4 的到来。使用线程是一种选择,但它只是解决此问题的一种解决方法,而不是真正的解决方案:)。这个问题在java上也有bug。如果您有兴趣尝试在 bugs.sun.com 上查找错误 7012740@
      猜你喜欢
      • 2020-01-20
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多