JavaFx Task EventHandler处理哪个Thread

时间:2016-08-23 12:16:06

标签: java multithreading task javafx-8

对于JavaFX UI节点,如果我注册一个事件处理程序: 最终的MenuItem buyItem = new MenuItem(" Buy"); buyItem.setOnAction(new EventHandler< ActionEvent>(){     @覆盖     public void handle(ActionEvent event){         String symbol = row.getItem()。getSymbol();         String instrumentID = row.getItem()。getInstrumentID();         .....     } ); 我可以假设handle()中的代码将始终在JavaFX应用程序Thread中执行,因此不需要将它们包装在Platform中。 runLater。 但是当我使用javafx.concurrent.Task时: import javafx.concurrent.Task; 公共类BuyTask扩展Task< Map< String,Object>> {     ...... } BuyTask buyTask = new BuyTask(this.api,params); 线程buyThread =新线程(buyTask); buyThread.start(); buyTask.setOnSucceeded(new EventHandler< WorkerStateEvent>(){     @覆盖     public void handle(final WorkerStateEvent workerStateEvent){         Map< String,Object> result =(Map)workerStateEvent.getSource()。getValue();         .......         Platform.runLater(new Runnable(){             @Override public void run(){                 portfolioService.restart();             }         });     } } 在哪个线程中执行任务的事件处理程序?因为我需要在javafx.concurrent.ScheduledService上执行重启 - >提到的portfolioService.restart()必须在JavaFX Application Thread中完成,我将它包装在Platform.runLater中。 但它需要吗?此任务事件处理程序是否也始终在JavaFX Application Thread中执行?谢谢!

1 个答案:

答案 0 :(得分:1)

Task的JavaFX文档有答案:

  

因为Task设计用于JavaFX GUI应用程序,所以它确保对其公共属性的每次更改,以及状态,错误和事件处理程序的更改通知都发生在主JavaFX应用程序线程上。

所以 - 不,没有必要用Platform.runLater打包电话。