JavaFX, как и многие другие gui-библиотеки, однопоточна. При создании окна создаётся
Event Dispatch Thread, внутри которого будет работать цикл событий и обработчики событий. Вы не должны пытаться из главного потока или любого другого потока взаимодействовать с элементами графического интерфейса - это приведёт к сбою. Вы не должны внутри обработчиков событий запускать потоки - это приведёт к сбою. Если вам надо из другого потока изменить, например, текст метки, то придётся создать задание для EDT:
Platform.runLater((() -> someLabel.setText("Hello"));
Если вам нужно внутри обработчика нажатия на кнопку запустить на выполнение длительную задачу, придётся использовать
Task и
Service:
public class Example extends Application {
...
btn.setOnAction(act -> {
Service<Void> service = new Service<Void>() {
@Override
protected Task<Void> createTask() {
return new Task<Void>() {
@Override
protected Void call() throws Exception {
// Долгий код
return null;
}
};
}
};
service.start();
});
}