1.创建线程有几种方式
继承Thread类,重写run方法,用start开启线程
实现Runable接口,通过thread调start方法
实现Callable接口,有返回值通过futrueTask进行封装
2.Synchronized 和 lock的区别
1.lock的加锁和解锁是由java代码实现的,Synchronized 是由JVM管理
2.Synchronized 能锁方法、类、代码块,lock只能在范围块
3.lock能提高多个线程读操作效率
3.Synchronized 锁升级原理
在jdk1.6之前由监视器锁(monitor) 实现加锁释放
在1.6之后进行升级,由偏向锁的无锁到轻量级锁CAS自旋锁,进行加锁如果自旋10次后会变成重量级锁
4.线程的生命周期&几种状态
新键——就绪——阻塞——运行——死亡
5.sleep 和 wait的区别
sleep是Thread类的方法,wait是Object的方法
sleep休眠时不会释放锁,wait在等待时要释放锁
sleep在任何地方可以使用,wait只能在同步代码块使用
6.Synchronized 和 volatitle 关键字的区别
Synchronized 是线程同步的重量级实现,volatitle 的轻量级实现
Synchronized 可以修饰代码块和方法,volatitle 只能修饰变量
volatitle 只能保证数据的可见性不能保证原子性,Synchronized 两者都可以保证
7.线程池的7大参数
corepoolsize:核心线程,不会被销毁
MaximumPoolSize :最大线程数,非核心线程数用完之后会销毁
KeepAliveTime :非核心线程
Unit :空闲时间单位
WorkQueue :阻塞队列,超过核心线程数时会进行排队
ThreadFactory :创建新线程
Handler :拒绝策略
线程池执行流程 :首先进入看线程池的线程数小于核心线程数,新创建一个任务执行,当核心线程数用完时会进入阻塞队列,阻塞队列也满时进入拒绝策略