【发布时间】: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没有区别,但创建一个单独的线程确实解决了问题。