Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在新线程中执行任务时JavaFX UI冻结_Java_Multithreading_Javafx - Fatal编程技术网

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

在新线程中执行任务时JavaFX UI冻结,java,multithreading,javafx,Java,Multithreading,Javafx,在执行后台任务时,我无法让JavaFXUI保持活动状态。 我已经设置了这个非常简单的代码- @FXML 进度条程序; @FXML 私有void onClick(ActionEvent事件){ 任务t=新任务(){ @凌驾 受保护的Void调用()引发异常{ 对于(int i=0;i

在执行后台任务时,我无法让JavaFXUI保持活动状态。 我已经设置了这个非常简单的代码-

@FXML
进度条程序;
@FXML
私有void onClick(ActionEvent事件){
任务t=新任务(){
@凌驾
受保护的Void调用()引发异常{
对于(int i=0;i<10;i++){
更新进度(i,9);
睡眠(1000);
}
返回null;
}
};
prgbProgress.progressProperty().bind(t.progressProperty());
新线程(t.run();
}
我希望每1秒钟更新一次进度条,直到任务完成。相反,UI完全冻结10秒钟,之后进度条显示为已完成。 只是想澄清一下——问题不仅在于最终所有的更新都会同时出现,而且在此之前用户界面完全没有响应

我读过关于这个话题的其他问题,但找不到答案。我做错了什么

谢谢。

使用start()代替run()

@FXML
进度条程序;
@FXML
私有void onClick(ActionEvent事件){
任务t=新任务(){
@凌驾
受保护的Void调用()引发异常{
对于(int i=0;i<10;i++){
更新进度(i,9);
睡眠(1000);
}
返回null;
}
};
prgbProgress.progressProperty().bind(t.progressProperty());
//新线程(t).run();//错误
新线程(t).start();//右
}
使用start()而不是run()

@FXML
进度条程序;
@FXML
私有void onClick(ActionEvent事件){
任务t=新任务(){
@凌驾
受保护的Void调用()引发异常{
对于(int i=0;i<10;i++){
更新进度(i,9);
睡眠(1000);
}
返回null;
}
};
prgbProgress.progressProperty().bind(t.progressProperty());
//新线程(t).run();//错误
新线程(t).start();//右
}

run()
->
start()
。您只是在当前线程中以
Runnable
的形式运行
线程
实例。是的,正如@MarkoTopolnik所写,您没有在新的
线程
中执行
任务。尝试
新线程(t).start()谢谢!现在我觉得自己很愚蠢。
run
start
之间的区别可以更加清楚,尽管…
run()
->
start()
。您只是在当前线程中以
Runnable
的形式运行
线程
实例。是的,正如@MarkoTopolnik所写,您没有在新的
线程
中执行
任务。尝试
新线程(t).start()谢谢!现在我觉得自己很愚蠢。但是,
run
start
之间的区别可以更加清楚……有什么区别?有什么区别?
@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
}