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