javaFX2.0线程结构分析

1、简述

JavaFX是一个强大的图形和多媒体处理工具包集合,它允许开发者来设计、创建、测试、调试和部署富客户端程序,并且和Java一样跨平台。

2、组成结构

3、线程结构

javafx运行时包含以下几个线程:

  • javaFX launcher Thread(javaFX启动器,以下简称为:”启动器线程“)
  • JavaFX Application Thread(javaFX应用工作线程,以下简称为:”工作线程“)
  • QuantumRenderer Thread(javaFX量子渲染线程,以下简称为:”渲染线程“)

4、线程分析

(1)javaFX launcher Thread(javaFX启动器线程)

启动器线程启动了javaFX工作线程以及渲染线程,并且执行了Application中的init()方法,也就是说启动器线程主要作用是初始化javaFX应用程序上下文。

该线程可被阻塞,阻塞后工作线程和渲染线程都不会启动。

参考javafx2.0源码

 // Create a new Launcher thread and then wait for that thread to finish
        final CountDownLatch launchLatch = new CountDownLatch(1);
        Thread launcherThread = new Thread(() -> {
            try {
                launchApplication1(appClass, preloaderClass, args);
            } catch (RuntimeException rte) {
                launchException = rte;
            } catch (Exception ex) {
                launchException =
                    new RuntimeException("Application launch exception", ex);
            } catch (Error err) {
                launchException =
                    new RuntimeException("Application launch error", err);
            } finally {
                launchLatch.countDown();
            }
        });
        launcherThread.setName("JavaFX-Launcher");
        launcherThread.start();

        // Wait for FX launcher thread to finish before returning to user
        try {
            launchLatch.await();
        } catch (InterruptedException ex) {
            throw new RuntimeException("Unexpected exception: ", ex);
        }

        if (launchException != null) {
            throw launchException;
        }

javaFX启动顺序:

执行main()方法,启动程序入口,当前线程:main
执行Appliction.init()方法,初始化窗体,当前线程:JavaFX-Launcher
执行Appction.start()方法,打开窗体,当前线程:JavaFX Application Thread
执行Applicton.stop()方法,窗体已关闭,当前线程:JavaFX Application Thread

(2)JavaFX Application Thread

显示渲染线程已经处理完的帧并显示出来。渲染线程和工作线程分离,也就是说javaFX使用异步渲染,渲染时并不会阻塞工作线程,这样的好处是工作线程有足够的时间来处理逻辑计算。

该线程可被阻塞,阻塞后不影响其他线程。

比如我们在start()方法里阻塞住,那么窗体就会停止从渲染线程同步帧(保持之前显示的画面不动),但是不影响渲染线程。

执行Appction.start()方法,打开窗体,当前线程:JavaFX Application Thread
执行Applicton.stop()方法,窗体已关闭,当前线程:JavaFX Application Thread

(3)QuantumRenderer Thread

渲染线程只负责渲染窗体(Stage)当前场景(Scene)内的所有节点(Node),并把渲染完的帧交给工作线程进行显示。

渲染线程会控制帧率,最高帧率不超过60帧

  • Windows XP和Vista上使用DirectX 9
  • Windows 7上使用DirectX 11
  • Mac、Linux、嵌入式设备上使用OpenGL
  • 不支持GPU渲染时使用CPU渲染(jre内置cpu渲染引擎)

猜你喜欢

转载自blog.csdn.net/eguid/article/details/93881571