У меня есть поток внутри класса, как this-Как уведомить всех наблюдателей, не удерживая нить?
import java.util.Observable;
public class Download extends Observable {
private int state = 0;
private final Thread myThread = new Thread(() -> {
/*
some work to do here
*/
setChanged();
notifyObservers(state);
});
public void download(int state) {
if (!myThread.isAlive()) {
this.state = state;
myThread.start();
}
}
public Thread getThread() {
return myThread;
}
public static void MyMethod() throws InterruptedException {
Download down = new Download();
down.addObserver((Observable ob, Object dat) -> {
System.out.println(ob);
if ((int) dat == 1) {
down.download(2);
} else {
System.out.println("success");
}
});
down.download(1);
down.getThread().join();
}
public static void main() throws InterruptedException {
MyMethod();
}
}
Проблема в том, я никогда не получить его, чтобы напечатать "success"
сообщений.
Я предполагаю, что все наблюдатели уведомляются изнутри MyThread
. Поэтому, когда down.download(2)
вызывается из наблюдателя внутри MyMethod()
, предыдущий поток все еще работает и вызов игнорируется.
Как я могу уведомить всех наблюдателей из основного потока, а не из myThread
?
'if (dat == 1)': Это сравнивает ссылки на объекты. Вместо этого вы хотите сравнить примитивный int. –
@MarkusKull На самом деле он ничего не делает, кроме причины ошибки времени компиляции. Это то, что происходит, когда люди не публикуют фактический код, который они используют. – Kayaman
@ Кайаман. У тебя все получилось. Извините, я не смог опубликовать свой полный код, потому что он слишком большой. Я написал эту демо-версию без компиляции. – Dipu