【问题标题】:JavaFx Task EventHandler handled in which ThreadJavaFx Task EventHandler 在哪个线程中处理
【发布时间】: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 -&gt; portfolioService.restart() 提到必须在JavaFX 应用程序线程中完成,所以我将它包装在Platform.runLater 中。

但这是必需的吗?这个任务事件处理程序是否也总是在 JavaFX 应用程序线程中执行?谢谢!

【问题讨论】:

    标签: java multithreading task javafx-8


    【解决方案1】:

    Task 的 JavaFX 文档有答案:

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

    所以 - 不,不需要用 Platform.runLater 结束通话。

    【讨论】:

    • @firephil - 请仔细阅读这个问题和示例。这个问题是关于 onSucceededonFailed 事件,Task 类总是在 JavaFX UI 线程上调用。 Task 文档中的示例展示了任务主逻辑内部的变化,而不是 onSucceededonFailed 事件处理程序。
    猜你喜欢
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 2011-01-28
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    相关资源
    最近更新 更多