JavaFX UI在新线程中执行任务时冻结

时间:2014-10-27 15:09:58

标签: java multithreading javafx

我在执行后台任务时让JavaFX UI保持活动状态时遇到问题。 我已经设置了这个非常简单的代码 -

@FXML
ProgressBar prgbProgress;

@FXML
private void onClick(ActionEvent event) {
      Task <Void> t = new Task <Void> () {

        @Override
        protected Void call() throws Exception {
          for (int i = 0; i < 10; i++) {
            updateProgress(i, 9);
            Thread.sleep(1000);
          }
          return null;
        }
      };
      prgbProgress.progressProperty().bind(t.progressProperty());
      new Thread(t).run();
}

我期望发生的事情是每隔约1秒更新一次进度条,直到任务完成。相反,UI完全冻结10秒钟,之后进度条显示完成。 只是为了说清楚 - 问题不仅仅是所有更新最终一次出现,而且在此之前UI完全没有响应。

我已经阅读了关于此主题的任何其他问题,但无法找到答案。我做错了什么?

感谢。

1 个答案:

答案 0 :(得分:4)

使用 start()代替 run()

@FXML
ProgressBar prgbProgress;

@FXML
private void onClick(ActionEvent event) {
      Task <Void> t = new Task <Void> () {

        @Override
        protected Void call() throws Exception {
          for (int i = 0; i < 10; i++) {
            updateProgress(i, 9);
            Thread.sleep(1000);
          }
          return null;
        }
      };
      prgbProgress.progressProperty().bind(t.progressProperty());
      //new Thread(t).run(); // wrong
      new Thread(t).start(); // right
}