我知道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