В моем приложении JavaFX-11 f xml у меня есть простая тестовая задача:
public class TestTask extends Task<Void> {
@Override
protected Void call() throws Exception {
updateMessage("TestTask message before sleep 1");
Thread.sleep(1000);
updateMessage("TestTask message after sleep 1");
Thread.sleep(1000);
updateMessage("TestTask message after sleep 2");
Thread.sleep(1000);
updateMessage("TestTask message after sleep 3");
return null;
}
}
В классе контроллера f xml я связал свойство со свойством сообщения Задача, и прослушиватель изменений, который я хочу использовать для записи сообщений в окне журнала:
TestTask testTask = new TestTask();
SimpleStringProperty taskMessage = new SimpleStringProperty();
taskMessage.bind(testTask.messageProperty());
taskMessage.addListener(cl -> {
System.out.println("taskMessage change listener invoked, new value = " + taskMessage.getValue());
msgList.add(taskMessage.getValue());
});
Я запускаю поток следующим образом:
Thread computationThread = new Thread(testTask);
computationThread.setDaemon(true);
computationThread.start();
На консоли отображаются следующие сообщения:
taskMessage change listener invoked, new value =
taskMessage change listener invoked, new value = TestTask message after sleep 3
Я знаю, что «промежуточные значения сообщений могут объединяться для экономии на уведомлениях о событиях», но здесь мы говорим только о 4 сообщениях, разделенных 1 секундой. Они вряд ли могут затопить очередь событий, поэтому я не понимаю, почему связанное свойство обновляется только дважды: один раз с пустым сообщением и второй раз с последним сообщением.