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();
  }
}