对于 JavaFX UI 节点,如果我注册一个事件处理程序:
final MenuItem buyItem = new MenuItem("Buy");
buyItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
String symbol = row.getItem().getSymbol();
String instrumentID = row.getItem().getInstrumentID();
.....
}
);
我可以假设 handle()
里面的代码将始终在 JavaFX 应用程序线程中执行,因此无需将它们包装在 Platform. runLater
中.
但是当我与 javafx.concurrent.Task
一起工作时:
import javafx.concurrent.Task;
public class BuyTask extends Task<Map<String, Object>> {
......
}
BuyTask buyTask = new BuyTask(this.api, params);
Thread buyThread = new Thread(buyTask);
buyThread.start();
buyTask.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(final WorkerStateEvent workerStateEvent) {
Map<String, Object> result = (Map) workerStateEvent.getSource().getValue();
.......
Platform.runLater(new Runnable() {
@Override public void run() {
portfolioService.restart();
}
});
}
}
任务的事件处理程序在哪个线程中执行?正如我需要做的perform restart on a javafx.concurrent.ScheduledService -> portfolioService.restart()
其中提到必须在JavaFX应用程序线程中完成,我将其包装在 Platform.runLater
中.
但是这是必需的吗?该任务事件处理程序是否也始终在 JavaFX 应用程序线程中执行?谢谢!
最佳答案
Task
的 JavaFX 文档有答案:
Because the Task is designed for use with JavaFX GUI applications, it ensures that every change to its public properties, as well as change notifications for state, errors, and for event handlers, all occur on the main JavaFX application thread.
所以 - 不,不需要用 Platform.runLater
包装调用。
关于JavaFx任务EventHandler在哪个线程中处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39100941/