几乎所有的 GUI 平台都使用单线程事件调度模型,JavaFX 也不例外。JavaFX 在处理多线程编程时遇到了一系列独特的挑战。原因是 JavaFX 主要设计为以或多或少的线性方式工作。所有用户界面事件都在 JavaFX 应用程序线程中处理。为了充分利用现代多核机器,JavaFX 应该能够利用 Java 编程语言的多线程。本文试图解释JavaFX编程外围下的多线程原理。
JavaFX 场景图不是线程安全的
JavaFX UI 设计从一个阶段开始。它是顶级 UI 容器。但是,Stage 的实际实现取决于部署它的平台,例如网页、平板电脑或桌面。JavaFX 场景在由节点代表的演员在视觉上相互交互的舞台上播放。场景是场景图中所有内容的容器。JavaFX 中多线程的主要问题是场景图本身不是线程安全的。它被建模为在单个 JavaFX 应用程序线程上执行。在 JavaFX-Launcher 线程中调用构造函数和初始化方法 init()。在 JavaFX 应用程序线程中调用 start() 和 stop() 方法。这些事件也在 JavaFX 应用程序线程上进行处理。因此,现场的任何实时操作都必须单独在主应用程序线程上完成。
未附加到现场场景的节点可以在其他线程中创建和操作。但是,一旦它们被附加,它们就不能被多个线程操作而不会有不正确结果的风险,因此可能会破坏场景图。在主应用程序线程上应用的任何长时间运行的任务都必然会冻结用户界面。从多线程编程的角度来看,这显然是不可接受的。JavaFX 应用程序中的线程安全无法通过同步线程操作来实现。我们必须确保操作场景图的程序只能从 JavaFX 应用程序线程中执行此操作。因此,JavaFX 中的多线程必须以不同的方式处理。
线程限制
线程限制是一种与JavaFX一起应用来实现多线程的技术。这是一种只允许一个线程访问代码的线程不安全部分的技术,从而确保以简单的方式实现线程安全。然而,这是在 Java 编程的许多其他领域中应用的常用技术。线程限制中的任何数据也称为线程本地