多线程
多线程:
多任务多条路径多个顺序流同时执行
优点:
1、资源利用率更好,
2、在某些情况下更简单
3、程序响应快
缺点:
1、设计更复杂
2、上下文切换开销大
线程的创建:
1、继承Thread类,重写run()方法,run方法中定义多线程的线程体
2、实现Runnable接口,重写run()方法 (推荐使用,优点:避免单继承的局限性,实现资源共享)
3、实现Callable接口,重写call()方法(优点:可以抛出异常,接收返回值;缺点:使用麻烦)
线程状态:
新生状态:new创建一个线程
就绪状态:开启线程(start())时,线程就进入就绪队列,等待cpu的调度
线程如何进入就绪状态:
1、开启线程(start())
2、阻塞状态解除
3、线程切换,被切换的线程恢复就绪状态
4、yield() 礼让线程
让出CPU资源,恢复到就绪状态
运行状态:cpu调用分配时间片给线程,线程就会运行
阻塞状态:sleep()
线程如何进入阻塞状态:
1、sleep():线程睡眠
1)、模拟网络延迟
2)、放大问题的可能性
让CPU的资源,不会让出对象的锁(保证资源休息),指定休息多少毫秒
2、wait()
3、join()
终止状态:线程结束了
如何控制线程终止:
1、stop()-->不推荐
2、通过标识判断
3、正常执行结束
一个线程一旦进入阻塞状态,阻塞状态解除后,不会立马恢复到运行状态,而是回复到就绪状态,等待cpu的调度
一个线程一旦进入终止状态,就不会恢复了
获取线程的状态:
Thread中的getState()方法;
线程的优先级:
提高先执行效率
getPriority()返回该线程的优先级
setPriority(int newPriority)改变这个线程的优先级
1~10 1优先级最小 10优先级最大 默认是5
线程安全:
多线程同时操作同一份资源才有可能出现线程不安全的问题,需要控制安全
同步锁:synchronized
锁的内容:this 类 资源(成员变量)
锁this,相当于锁当前调用成员方法的对象,把这个对象的资源都锁住了
锁类:相当于把这个类的内容都锁住
锁资源:成员变量,要是自定义的引用数据类型
锁的范围:{}中的代码
同步方法:在方法上使用synchronized修饰
锁成员方法,相当于锁this,代码范围为方法
静态方法,
同步块:synchronized(锁的内容){同步的代码范围}
注意:
锁的范围太大,效率低
锁的范围太小,锁不住
锁不变的内容
线程通信:
wait()等待
notify()唤醒
notifyAll()唤醒对象等待池的线程
要求使用在一个同步环境下,同步一个相同的对象才行