我知道Java的实际模型是用于协作线程的,它强制线程死亡不会发生。在PropertyListener中杀死一个线程(JavaFX8)
由于Thread.stop()
已弃用(基于上述原因)。我试图通过一个BooleanProperty监听器来停止线程。
这里是MCVE:
TestStopMethod.java
package javatest;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.value.ObservableValue;
public class TestStopMethod extends Thread {
private BooleanProperty amIdead = new SimpleBooleanProperty(false);
public void setDeath() {
this.amIdead.set(true);
}
@Override
public void run() {
amIdead.addListener((ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) -> {
System.out.println("I'm dead!!!");
throw new ThreadDeath();
});
for(;;);
}
}
WatchDog.java
package javatest;
import java.util.TimerTask;
public class Watchdog extends TimerTask {
TestStopMethod watched;
public Watchdog(TestStopMethod target) {
watched = target;
}
@Override
public void run() {
watched.setDeath();
//watched.stop(); <- Works but this is exactly what I am trying to avoid
System.out.println("You're dead!");
}
}
Driver.java
package javatest;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Driver {
public static void main(String[] args) {
try {
TestStopMethod mythread = new TestStopMethod();
Timer t = new Timer();
Watchdog w = new Watchdog(mythread);
t.schedule(w, 1000);
mythread.start();
mythread.join();
t.cancel();
System.out.println("End of story");
} catch (InterruptedException ex) {
Logger.getLogger(Driver.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
你认为哪一个线程被抛出'ThreadDeath'错误? – 2014-10-08 18:05:25
我想,如果我添加一个监听器到一个属性并在WatchDog中改变它的值,它会引发这个异常。现在的代码保持运行,所以'mythread.join()'永远不会被调用。 – DeMarco 2014-10-08 18:09:56
它将从改变属性的线程抛出,这是支持定时器实例的线程。 (如果你仔细想想,基本上不可能安排在任意线程上调用监听器。)我认为你将拥有该方法的对象与执行该方法的线程混淆了。 – 2014-10-08 18:12:01