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