JavaFX
复习
1、进程和线程 --- 都是为了解决多任务而提出来,这里要分清楚“所谓的同时”不是绝对意义的同时,而是由CPU在它们之间快速的来回切换。
进程 其实我们可以看成是操作系统的多任务,也就是同时开启多个程序(用户程序和后台程序)。进程的特点:独立内存地址空间。
线程 是在进程(程序)内部开启的多个独立执行分支。特点:一个进程中的多线程是共享内存地址空间的。
JVM就是一个进程,然后我们在其内部执行的main方法就是一个线程,除了main线程以外还有很多其他的线程(比如:GC)。
我们在这一章学习的目的是:在main线程启动以后,我们还可以开启自己定义的其他线程。
2、在API层面,我们讲解了三种开启线程的方式:Thread类、Runnable接口和Callable接口。其中最核心的是Thread类,他提供了线程的初始化、启动、状态管理和销毁等方法。由于Java是单继承的,所以又提供了两个接口的实现方式,但这两种方式最终都还是要绑定到Thread类上。
Runnable和Callable的区别:Runnalbe的run方法既没有返回,也没有异常的抛出,但实现起来更简单;
Callable的call方法可以有返回,也能抛出异常,但实现起来要多一些步骤。
如果主线程需要获取子线程运行结束以后的一个唯一结果,或者子线程抛出的异常需要主线程来解决,在这两种情况下,我们要用Callable,其他普通情况,我们都是用Runnable即可。
3、线程的生命周期
新建状态、就绪状态、运行状态、中断状态和死亡状态。
要求:把这5个状态要和代码对应。
新建 --- new出Thread对象
就绪 --- 调用Thread对象的start方法,但是start方法调用run方法之前;
运行 --- start调用run方法;
死亡 --- run方法执行结束
中断状态是有多个原因造成的:
主动休眠 --- Thread.sleep()
没有抢到CPU --- 可以通过线程的优先级进行调整;
输入输出造成的阻塞 --- scan.next();
在同步情况下的主动等待或退出 --- wait() 和 notify() 方法。
4、线程的安全性
不是所有的多线程都会有线程安全性问题,必须满足“多个线程操作同一资源对象”。
如果线程安全性问题,解决方案:同步(synchronized)。同步的实现是给这个资源对象加锁,让一个线程在执行的时候,其他线程只能进行等待;只有在这个线程执行结束以后,其他线程才能进入。
这就可以理解为什么JDK既要提供线程安全的实现类又要提供线程不安全的实现类了。
5、关于同步的实现:
. 同步方法
同步方法是把synchronized加在资源的某个方法声明处,那么这个方法在外部线程调用的时候就会被加锁。 synchronized关键字是作为方法的可选修饰符存在的。
. 同步块
同步块则是在资源方法上不加任何同步修饰,那么这个方法既可以普通调用又可以同步调用。同步块语法:
synchronized(资源对象){
资源对象.方法1();
资源对象.方法2();
....
}
6、死锁
当两个线程同时操作一对儿需要循环依赖的资源的时候,有可能出现死锁的情况。
这个时候的解决方案就是"线程间的通信"。让某个线程主动调用wait()方法进入等待,那么这个线程就退出去了,他同步的资源就释放开了。这个时候另一个线程就可以完成它的任务了。当它完成以后,主动调用notify方法,那么前面进入等待的线程就会被唤醒,然后开始执行。
wait和notify是专门用于线程间通信的方法,来自于Object这个类。 还有一个方法叫做notifyAll(),它是唤醒所有等待的线程,然后让它们进行抢夺。而notify方法只是唤醒第一个调用wait方法的线程对象。
7、对于大家来说,不管前端还是后端,都要建立多线程程序运行效果的感性认识,因以后你们的工作方向是B/S的。 当然,无乱是前端还是后端的同学以后直接书写多线程的机会比较少,因为现在的成熟框架都给我们实现了。但是后面的很多优化动作需要做的一些配置都是为了多线程而设计,所以大家还是要有所了解。
Java的GUI
GUI --- Graphics User Interface
图形用户界面。
Java的GUI技术分三代:
1、awt --- 它是使用当前操作系统的图形图像库来完成快速的界面实现。但是由于不同操作系统的图形图像库在很多细节上是有差异的,所以导致同一段JavaGUI程序在不同的操作系统上运行会有显示上的差异性。
2、swing --- 它是Java的第二代GUI库,把第一代库当中可能出现差异性的类给取代调用了,让Java自己去生成它们,比如:我们在前面使用的JOptionPane就是属于swing当中的一个类。
所以很长一段时间,Java的GUI开发是使用awt + swing共同实现的,也被称之为swt。
3、到了08年左右,SUN公司提出了一套新的GUI技术,被称之为"JavaFX"。它推翻了之前的swt,采用Java对象+CSS样式+XML配置的形式。它在JDK8的时候被纳入到了JDK默认的包当中,但是JDK9的时候又被移除了,成为一个独立的模块,让程序员根据自己的需求进行添加。
说一句:不管是JDK中一直自带的awt+swing,还是现在JavaFX,其实都不是我们之后要用的界面实现。我们更多的界面实现还是用的是HTML+CSS+JS的浏览器端开发,只有极少的情况需要用到桌面版的GUI技术。
JavaFX的基本结构和概念
Application --- 代表了JavaFX的应用程序
Stage --- 舞台 --- 代表了一个窗体。 在Application的start方法中,提供了一个默认的窗体对象。我们也可以根据自己的需要,new出新的窗体。
Scene --- 场景 --- 代表了窗体当中的内容板。 Scene对象在创建的时候要求传参,参数是一个布局。