JavaFX并发
时间:2020-01-09 10:36:35 来源:igfitidea点击:
术语JavaFX并发性是指JavaFX在多线程和并发方面的设计方式。在此JavaFX并发教程中,我将解释JavaFX线程模型。
如果我们不熟悉Java并发和多线程,那么我有更长的Java并发教程,比本文中有足够的空间来解释它的工作原理。
单线程渲染
JavaFX使用单线程渲染设计,这意味着只有一个线程可以渲染屏幕上的任何内容,这就是JavaFX应用程序线程。实际上,通常只允许JavaFX应用程序线程对JavaFX Scene Graph进行任何更改。
单线程渲染设计更容易正确实现,但是在JavaFX应用程序线程中运行的长时间运行的任务使GUI无法响应,直到任务完成为止。当JavaFX应用程序线程正在忙于执行该任务时,没有JavaFX GUI控件会对鼠标单击,鼠标悬停,键盘输入做出反应。
Platform.runLater()
有时,我们绝对需要在JavaFX应用程序中执行一些长期运行的任务。我们不想在任务运行时让GUI无响应,因此想在其自己的线程中运行Ask。但是,我们希望正在运行的任务在执行过程中或者完成时更新GUI。任务线程无法直接更新GUI(场景图),但是JavaFX提供了针对此问题的解决方案。
JavaFX包含具有" runLater()"方法的" Platform"类。 runLater()方法采用一个Runnable,该时间由JavaFX应用程序线程在有时间时执行。在此Runnable内部,我们可以修改JavaFX场景图。这是一个示例示例,显示任务线程通过调用`Platform.runLater()在执行时更新JavaFX ProgressBar并从中更新ProgressBar控件:
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class ConcurrencyExample extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("JavaFX App");
ProgressBar progressBar = new ProgressBar(0);
VBox vBox = new VBox(progressBar);
Scene scene = new Scene(vBox, 960, 600);
primaryStage.setScene(scene);
primaryStage.show();
Thread taskThread = new Thread(new Runnable() {
@Override
public void run() {
double progress = 0;
for(int i=0; i<10; i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
progress += 0.1;
final double reportedProgress = progress;
Platform.runLater(new Runnable() {
@Override
public void run() {
progressBar
.setProgress(reportedProgress);
}
});
}
}
});
taskThread.start();
}
}

