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