У меня проблема с завершением потоков. Проблема заключается в том, что я использую поток апплета для доступа к 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...");
}
}
Спасибо