【发布时间】:2016-08-23 12:16:06
【问题描述】:
对于 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 应用程序线程中执行?谢谢!
【问题讨论】:
标签: java multithreading task javafx-8