JavaFx任务EventHandler在哪个线程中处理

标签 java multithreading task javafx-8

对于 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/

相关文章:

java - 当为 osgi 使用声明性服务时,我可以在同一组件中提供和引用服务吗?

java - 在java类路径中转义通配符处理

.net - Microsoft.NET 和毁灭战士的多核 CPU

c++ - 在 C++ 中限制 CPU 使用

PHP:如何正确使用 socket_select() 和 socket_read()

c# - 等待具有 OnlyOnFaulted Continuation 的任务会导致 AggregateException

java - 如何使用 Immutables 和 Egg 模式设置基类字段

C# 任务、System.Threading.Thread.CurrentThread.CurrentCulture 和 Microsoft.Office.Interop.Excel

multithreading - iTask - 如何使用变量作为任务过程的参数

java - 获取数组中元素的索引[错误]