多线程使用
线程是系统调度的基本单位,多线程,提高了多核CPU的利用率
创建线程
两种创建线程的方式集成Thread和实现Runnable接口
继承Thread类
重写run方法
start开启线程
继承Thread原理
Thread可以新建单独的执行路径
多线程异常
线程出现异常,结束当前线程
多线程安全问题
产生原因:
1.共享资源
2.对共享资源操作有多条操作
解决思路:
同步
注意:锁是同一个
同步好处:解决多线程安全问题
同步弊端:降低程序性能(为了安全可以选择降低性能)
降低同步的低效率问题,加双重判断
同步函数和同步代码块
同步函数的锁是固定this
同步代码块可以是任意(需要多个锁时使用)
run方法加synchronized,等于单线程
同步的区分是通过锁区分
静态同步函数使用的锁
字节码文件对象 XXX.class
死锁
死锁原因:互相拿到对方的锁
手写死锁
多线程提高:生产消费
等待唤醒
wait()
this等待的会放在this的线程池中,且只能this才能notify()
notify()
notifyAll()
多生产多消费一定是while循环
添加while后死锁:原因是,生产者唤醒了生产者的线程
解决方案:notifyAll();JDK1.5以后的解决方案Locks
Condition
await signal signalAll
多线程低效率解决方案
A唤醒B的线程
多生产多消费多线程应用实例
守护线程
setDaemon标记为守护线程
后台进程
前台进程都结束,后台线程自动结束
优先级
setPriority
1-10
数字越大,优先级越高
默认5
线程组
对线程统一操作
线程可以自定义名称
join抢夺执行权,结束后还回执行权
yield暂停当前线程,让出执行权
面试题
-
run和start的区别
run是方法执行
start是开启线程 -
实现Runnable接口和Thread的区别(接口和继承的区别)
1.避免单继承局限性
2.更符合面向对象的思想,线程和任务区分开,可以封装任务对象 -
sleep和wait的区别
同:让线程处于冻结状态
异:
1.sleep必须指定时间,wait可以指定时间,也可以不指定
2.wait必须要唤醒(notify)
3.wait必须定义在同步中
4.wait立马释放锁,sleep不释放锁(因为sleep一定会醒) -
线程的停止
stop已过时
实质,run方法结束,定义标记
interrupt:清楚冻结状态,恢复运行状态,在异常信息中改变标记