Завершение потока Java-апплета на странице выгрузки - PullRequest
1 голос
/ 25 января 2010

У меня проблема с завершением потоков. Проблема заключается в том, что я использую поток апплета для доступа к JS DOM и манипулирую innerHTML диапазона, чтобы направить имя потока в качестве innerHTML. Он работает нормально, пока я не продолжу обновлять страницу, но если я не перестану спать примерно 200 мс и перейду на другую страницу, на которой нет апплета, это выдаст мне ошибку в консоли firebug:

document.getElementById("userName") is null

Я подозреваю, что, хотя я отправляю прерывание при останове, и я также пытался сделать это, установив переменную flag для запуска в цикле run while, поток выполняется намного быстрее, чем время, которое JVM тратит на его выгрузку, и измените мою страницу в браузере, но апплет все еще пытается найти элемент с идентификатором userName.

Это правда? Есть ли работа вокруг этого? Есть ли способ узнать, сколько потоков запущено в данный момент? Есть ли какая-нибудь команда kill all для отправки на destroy ()?

Я много искал, видел все API Java-потоков и апплетов, не смог заставить это работать.

Ниже приведен код:

import java.applet.Applet;
import netscape.javascript.*;

//No need to extend JApplet, since we don't add any components;
//we just paint.
public class firstApplet extends Applet {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    firstThread first;
    boolean running = false;

    public class firstThread extends Thread{
        JSObject win;
        JSObject doc;
        firstThread second;

        public firstThread(JSObject window){
            this.win = window;
        }
        public void run() {
            try{
                System.out.println("running... ");

                while (!isInterrupted()){

                    doc = (JSObject) win.getMember("document"); 
                    String userName = Thread.currentThread().getName();
                    //String userName = "John Doe";
                    String S = "document.getElementById(\"userName\").innerHTML = \""+userName+"\";";
                    doc.eval(S);
                    Thread.sleep(5);
                }
            }catch(Exception e){
                System.out.println("exception in first thread... ");
                e.printStackTrace();
            }
        }
    }

    public void init() {
        System.out.println("initializing... ");
    }

    public void start() {
        System.out.println("starting... ");
        JSObject window = JSObject.getWindow(this);

        first = new firstThread(window);
        first.start();
        running = true;
    }

    public void stop() {
        first.interrupt();
        first = null;
        System.out.println("stopping... ");
    }

    public void destroy() {
        if(first != null){
            first = null;
        }
        System.out.println("preparing for unloading...");
    }
}

Спасибо

Ответы [ 2 ]

0 голосов
/ 15 июня 2010

Эта проблема была решена с помощью переменных JS для управления выполнением Java-апплета, полное решение здесь: http://ciitronian.com/blog/programming/time-efficiency-controlling-java-applet-from-javascript-especially-if-you-make-round-trips-to-the-web-page-from-applet/

0 голосов
/ 25 января 2010

Разве вы не можете просто проверить, является ли document.getElementById ("userName") пустым, и только попытаться установить его, если это не так?

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