第二十三天 多线程
1. 多线程创建的两种方法
继承Thread类,重写run方法
建立Thread子类对象
Thread子类对象,调用start方法
============================
实现Runnable接口,重写run方法
建立Thread类对象,构造方法传递Runnable接口的实现类对象
Thread对象调用start方法
2. 线程的状态:被创建,运行,消亡,临时阻塞,冻结
3. 同步原理:
线程操作共享数据的时候,一个线程不执行完毕,其他线程不能执行
解决,线程操作中的数据安全问题‘
4. 同步代码块,同步函数
synchronized(对象){}
public synchronized void add(){}
5. 多线程的通信
多线程对共享数据,进行不同方向的操作
共享的数据资源模拟线程的通信
同步:
保证两点:多线程程序,同步之间用的是同一把锁(唯一对象)*****
6. 等待与唤醒机制
wait() 必须拥有此对象监视器(锁),如果要执行wait方法,必须在同步中
旦线程执行了wait方法,释放锁,并将执行权让给别的线程
当我们唤醒在锁上等待的线程后,这个线程还要从新获取锁,才能继续执行
7. wait(),notify(),notifyAll()不是Thread方法,而是Object中的方法,为什么要
将这3个方法,定义在Object类中:
在多线程程序中,需要使用同步锁,锁是任意的对象,对象都是由类创建的,所以在java中
任何类,都是Object的子类,所有建立的对象,都会具有操作线程的这个3个方法
8. 面试题:sleep()和wait()的区别
sleep()是Thread类的静态方法
wait()是Object类的方法
sleep()经过一定时间,线程自己醒来
wait()必须要被其他线程唤醒
sleep()线程休眠,但是不释放锁,在线程休眠的过程中其他线程,进不来锁
wait()方法,线程等待,但是释放锁,此时可以由别的线程来执行,而不唤醒后,必须要再次获取锁,才能执行
9. 多线程的生产者与消费者****
资源是一个产品,键盘,鼠标,电视
生产一个,消费一个
生产者,可能是多个生产线程
消费者,可能是多个消费线程
10. 通过生产者与消费者的数据安全问题的解决,同时暴露出来了,程序的性能为题
唤醒了全部的线程notifyAll()
唤醒全部线程,是很浪费的
唤醒自己本方是,没必要的
实现唤醒对方中的一个呢?
在Jdk1.4(包含)版本之前
在Jdk1.5(包含) lock锁,将线程分组管理,实现唤醒对方中的一个
11. JDK1.5的锁是使用步骤
通过Lock接口的实现类对象,获取锁ReentrantLock类
建立Condition对象,一个锁可以创建多个Condition对象,lock锁的newCondition方法
进行线程的操作
获取锁 Lock接口的lock方法
线程等待,Condition中的await()
线程的唤醒,Condition中signal()
释放锁 Lock接口的unlock方法
12. 线程的停止方法
终止run方法运行
利用InterruptedException异常,终止run方法运行
如果线程处于等待状态,如果需要线程停止运行,需要一个方法interrupt()方法
一旦线程执行这个方法,会让处于等待状态的线程,抛出InterruptedException异常,一旦出现异常
程序将进行catch的运行
理解interrupt()方法
你那失眠,找一个终极的催眠师,把你催眠了,深度睡觉之中,催眠师死了
我来了,拿一个板砖,向你的头打去,打醒了,受伤了(引发了异常)
13. 线程中的其他方法
setDaemon(true)main主线程开启了另一个线程,这个线程被设置为了守护线程,守护main线程
当main线程结束时候,这个线程也结束了
toString() Thread[Thread-0,5,main]
线程的优先级 setPriority(int newPriority)
join()等待线程终止,设置了join方法的线程,会一直执行到结束,才会让别的线程来执行
static yield()线程的让步
14. 图形化界面 GUI graph user interface
第一款具有革命意义的图形化界面操作系统 是 windows95
从 windows Vista 操作系统开始,出现软件界面设计新纪元
好处,不要记住命令,点击鼠标即可完成操作
15. awt包
窗体
组件
事件
菜单