2010-01-25 2 views
1

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

document.getElementById("userName") is null 

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

Это правда? Есть ли какая-нибудь работа вокруг? Есть ли способ узнать, сколько потоков работает в данный момент? Есть ли какая-либо команда kill для отправки на 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..."); 
    } 
} 

Благодаря

+0

Исходя из вашего первоначального поста (http://stackoverflow.com/questions/2072307/loading-java- апплет-на-РОМ нагрузки/2072385). Я думаю, ваше предположение верно; браузер меняет страницу быстрее, чем требуется, чтобы остановить апплет и прервать поток, поэтому ваш код пытается получить доступ к элементу, который больше не существует. В этот момент я согласен с ответом Нила Коффи. Это должно очистить консольную ошибку: String S = "if (document.getElementById (\" имя_пользователя \ ")) {document.getElementById (\" имя_пользователя \ "). InnerHTML = \" "+ имя_пользователя +" \ ";}"; – 2010-01-26 09:28:30

ответ

0

Не можете вы просто проверить, если document.getElementById («Username») равна нулю, и только попытаться установить его, если это не ... ?