Почему Firefox завершает мой апплет через 20 секунд? - PullRequest
3 голосов
/ 31 августа 2010

У меня есть простой апплет на такой веб-странице. (Это тестовый пример, вырезанный из более сложного апплета).

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 секунд, а затем внезапно завершит работу, как если бы виртуальная машина заканчивала работу (консоль Java исчезнет; значок Java останется в системном трее, пока я не наведу на него курсор мыши ; блок finally никогда не достигается).

Это последовательно 20 секунд. 20 "Сон на 1 секунду" напечатан из вышеприведенного кода, если я увеличу время ожидания до 5 секунд, то перед завершением будут напечатаны 4 сообщения.

В IE и Chrome на одном компьютере цикл будет продолжаться бесконечно, как и в Firefox 3.6.8 на другом компьютере.

Кто-нибудь может подсказать, почему апплет может завершиться таким образом?

Ответы [ 3 ]

4 голосов
/ 31 августа 2010

Из апплета учебник

Метод инициализации

Метод init полезен для одноразовой инициализации, которая неочень долгоМетод init обычно содержит код, который вы обычно помещаете в конструктор.Причина, по которой апплеты обычно не имеют конструкторов, заключается в том, что им не гарантируется наличие полной среды, пока не будет вызван их метод init.Держите метод init коротким, чтобы ваш апплет мог загружаться быстро.

Метод запуска

Каждый апплет, выполняющий задачи после инициализации (кроме прямого ответа на действия пользователя), должен переопределить метод запуска.Метод start запускает выполнение апплета.Хорошей практикой является быстрое возвращение из начального метода.Если вам нужно выполнять операции, требующие большого объема вычислений, для этой цели может быть лучше запустить новый поток.

Похоже, вам нужно создать свой собственный поток для долго выполняющихся методов.

1 голос
/ 01 февраля 2011

есть ошибки для светлячок .

Единственное решение, которое я нашел, это использовать Java меньше, чем 1.6_21 С 1.6_21 Firefox 3.0 и 3.6 сломан. К счастью, все должно работать в Firefox 4.

1 голос
/ 31 августа 2010
Can anyone suggest why the applet might terminate in this way?

Я не нашел официальной ссылки, но похоже, что время для инициализации истекло.Вы можете поместить свой код в метод start, который не должен иметь таких таймаутов.

From Javadoc init ()

Подкласс Applet долженпереопределите этот метод, если он имеет инициализацию для выполнения.Например, апплет с потоками будет использовать метод init для создания потоков и метод destroy для их уничтожения.

Я полагаю, вам нужна длительная инициализация, поэтому вы должны запустить поток длячто в методе init ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...