多线程:
多任务执行,如果没有多任务,就不需要多线程
多线程的创建方式:
1. 继承Thread,重写run()方法 + start()开启线程
2. 实现Runnable接口,重写run()方法
推荐使用的优点(1.避免单继承的局限性 2.实现资源供享)
3. 实现Callable接口,重写call()方法
优点:可以返回值,可以抛出异常
缺点:使用麻烦
线程状态:5个
1. 新生状态: 创建线程 new Thread()
2. 就绪状态: 调用start(),就绪队列中的线程 等待CPU的调度
3. 运行状态:cpu把时间分给那个线程,这个线程才会运行
4. 堵塞状态:sleep()…
5. 终止状态:结束,死亡
注意:
1. 一个线程一旦进入终止状态,没有办法
恢复,重新创建也是新的线程
2.一旦进入阻塞状态,不能直接恢复到运行状态,恢复到就绪状态
一个线程如何进入到死亡状态?
1.正常执行完毕 2.调用destroy() , stop() 3.通过添加标识判断--------推荐
一个线程如何进入到就绪状态?
1. 调用start()方法
2. 阻塞解除
3. yield 礼让
4. 线程切换
一个线程如何进入阻塞状态?
1. sleep()
2. join()
3. wait()
4. io操作
sleep(毫秒数) 线程睡眠 | 休息
抱着资源睡觉,告诉CPU在这个时间中不要把资源分配给我这个线程,因为处于阻塞状态,到时间了就恢复到就绪状态,这个时候cup才能把资源分配给我
sleep()的使用不要在如何同步环境下,如何在同步下使用了,在休眠途中,是不会释放对象锁的
(可以模拟网络延迟 放大问题的可能性)
yield 礼让线程 高风亮节(Thread.yield();)
把CPU的资源让出来,让cup重新分配,但是有可能又选择了原线程,可以选择其他线程,给其他线程能够获取资源的机会
合并线程,插队线程
join() 处于阻塞状态的方法
join(ms)等待指定秒数,到点了就阻塞等待了
线程的优先级别:1~10
默认一个线程的优先级别是: 5
MAX_PRIORITY 最大优先级: 10
MIN_PRIORITY 最小优先级: 1
NORM_PRIORITY 默认: 5
setPriority() 设置线路优先级
getPriority () 获取线路优先级
优先级只能控制概率问题,不能决定角色到底谁先执行
获取线程状态
Thread.State getState() 返回该线程的状态
控制线程安全问题:
前提:当多个线程同时操作同一个资源的时候,才有可能出现线程不安全问题
办法:使用同步锁 synchronized,控制多线程执行时,某一段重要的代码,排队执行,其他代码可以同时进行,又能提高效率,又能控制安全
使用方法:
同步方法:在方法上使用synchronized关键字
- 成员方法:对象,类,资源
- 静态方法:静态内容是属于类的,锁这个静态方法相当于锁类(比较简单,但是范围太大,可能效率会低)
同步块
是synchronized(this | 类 | 资源){
}
- this: 锁对象
- 类名.calss :只有一个,不变的对象内容,在类第一次加载内存就存在了
- 资源:成员实现
注意:
同步一定要同步不变的内容,变的内容锁不住,自定义类的对象地址
锁的范围太大了,效率太低,锁的范围太小,锁不住
难点:锁谁,this | 资源 | 类 | 方法 锁多大范围