java - 更新任务中的消息会挂起应用程序

标签 java javafx java.util.concurrent

我正在使用背景Thread运行我的加载代码并希望绑定(bind) MessageProperty Task的到标签。

但是,当调用updateMessage()时任务挂起;该消息永远不会更新,并且下一行代码不会执行。

这里使用的是 JDK 1.10.1。这是一个 MCVE:

import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {

        VBox root = new VBox(10);
        Label label = new Label("Message");
        root.getChildren().add(label);

        primaryStage.setScene(new Scene(root));

        Task loadingTask = new LoadingTask();
        Thread loadingThread = new Thread(loadingTask);
        loadingThread.setDaemon(true);

        label.textProperty().bind(loadingTask.messageProperty());
        loadingThread.start();

        primaryStage.setWidth(200);
        primaryStage.setHeight(200);
        primaryStage.show();
    }
}

class LoadingTask<Void> extends Task {
    @Override
    protected Object call() throws Exception {
        System.out.println("Loading task ...");
        updateMessage("Loading task ...");
        System.out.println("Message: " + getMessage());

        return null;
    }
}

输出:

Loading task ...

第二个System.out.println()永远不会被执行。

编辑:

我向 MCVE 添加了一个简单的 GUI,其标签绑定(bind)到 MessageProperty 。标签确实更新为显示“正在加载任务...”,但控制台输出保持不变; updateMessage() 之后的代码方法被调用并不执行。

第二次编辑:

我运行了我的单步调试器,并且出现 IllegalStateException正在从Task抛出class: “任务只能在 FX 应用程序线程中使用”

我不确定这意味着什么,因为重点是在不同的线程上运行此任务...

最佳答案

您唯一的问题是,您不能从 FX UI 线程以外的其他线程访问 getMessage()。尝试 Platform.runLater(() -> System.out.println("Message: "+ getMessage()));

关于java - 更新任务中的消息会挂起应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51224740/

相关文章:

java - @Valid 不使用 Spring Boot 与 JAX-RS 一起工作

javascript - JavaFx WebView 等待 Java 方法完成

java - ControlsFx 对话框无法在不同计算机上打开

java - 如果线程列表中的任何线程发生异常,则中断所有线程

java - 获取linkedHashMap的key和value

java - 如何使用 Apache PDFBox 拆分 PDF?

java 7 到 java 8 迁移 spring bean 创建异常

java - 没有 e(fx)clipse - 安装的 IDE 选项

java - Scala Map 和 ConcurrentHashMap 抛出 java.lang.UnsupportedOperationException

Java 锁定数组范围