2010-08-31 30 views
3

我在這樣的網頁上有一個簡單的小程序。 (這是一個從更復雜的小程序中刪除的測試用例)。爲什麼Firefox在20秒後終止我的小程序?

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中繼續。

任何人都可以提出爲什麼小程序可能以這種方式終止?

+0

感謝josefx和stacker提出了幾乎相同和基本正確的答案。 FWIW,把循環放在'start'而不是'init'沒有什麼區別,但是創建一個單獨的線程並沒有解決問題。 – Alohci 2010-08-31 13:13:42

回答

4

從applet的tutorial

init方法

init方法是一次性 初始化,這並不需要很長的 有用。 init方法通常包含 通常放入構造函數中的代碼。 理由小程序通常不具有 構造函數是他們不是 保證有一個完整的環境 直到他們的init方法被調用。 保持init方法的簡短,以便 您的applet可以快速加載。

啓動方法

執行後 初始化任務(除了直接 響應用戶操作)必須 重載起動方法的每個小程序。開始 方法開始執行 小程序。從啓動方法快速返回 是一種好習慣。如果您需要在計算上執行密集型操作,則可能需要 更好地爲此 目的啓動新線程。

看起來你必須爲長時間運行的方法創建自己的線程。

1
Can anyone suggest why the applet might terminate in this way? 

我還沒有找到一個官方的參考,但它看起來像一個初始化超時。 你可以把你的代碼放在start方法中,不應該有這樣的超時。

Javadoc init()

Applet的子類應該重寫 這種方法,如果它有初始化 執行。例如,具有線程的小程序 將使用init方法 來創建線程和銷燬方法來終止它們。

我想你需要一個長時間運行的初始化,因此你應該在init()方法中啓動一個線程。

1

有缺陷 firefox

我發現的唯一解決方案是使用小於1.6_21的java。從1.6_21開始,Firefox 3.0和3.6被打破。幸運的是,一切都應該在Firefox 4中工作。

+0

感謝您指出這一點。自從我爲長時間運行的進程添加單獨的線程後,我沒有遇到任何問題。幸運的是(我認爲!)正式版,我只需要支持IE 7和8。 – Alohci 2011-02-01 12:18:10

+0

由於oure公司只支持Firefox,所以我們情況更糟。現在我們只告訴我們的客戶安裝較低版本的java,並且正在等待firefox 4的到來。使用線程是一種選擇,但它只是解決此問題的一種解決方法,並非真正的解決方案:)。在java上這個問題也有bug。如果您有興趣嘗試在http://bugs.sun.com/上尋找bug 7012740 – wylix 2011-02-02 10:56:24