【问题标题】:JavaFX: Running a Task in a separate thread doesn't allow anything else to runJavaFX:在单独的线程中运行任务不允许其他任何东西运行
【发布时间】:2016-12-04 22:49:06
【问题描述】:

我需要在我的程序中不断更新数据,所以我认为通过使用 JavaFX 的 Task 可以让它在我的程序中作为一个单独的进程运行。

final Task task = new Task<Void>() {
    @Override
    protected Void call() throws Exception {
        Platform.runLater(() -> {
            while (true) {
                itemData.forEach(data -> {
                    System.out.println(data.getId());
                });
            }
        });
        return null;
    }
};
Thread thread = new Thread(task);
thread.setDaemon(true);
thread.start();

这是在Initializable接口提供的initialize方法中声明的。

然而,当运行这个程序时,任务是唯一运行的东西,即使任务是在单独的线程上运行的。为什么它会这样做而不是按预期运行?

【问题讨论】:

    标签: java multithreading javafx


    【解决方案1】:

    您只是开始一个任务,只是为了使用它在 UI 线程上发布一个长时间运行的任务。 Runnable

    () -> {
        while (true) {
            itemData.forEach(data -> {
                System.out.println(data.getId());
            });
        }
    }
    

    仍然在应用程序线程上运行,阻塞它。

    只应在应用程序线程上进行 UI 更新。繁重的工作应该在另一个线程上完成。

    您应该只在应用程序线程上发布更新。像这样的:

    @Override
    protected Void call() throws Exception {
        while (true) {
            try {
                // add a pause between updates
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
            }
            Platform.runLater(() -> itemData.forEach(data -> {
                System.out.println(data.getId());
            }));
        }
    }
    

    如果您过于频繁地发布更新,这也会导致应用程序无响应。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 2023-01-31
      相关资源
      最近更新 更多