多线程
线程状态
-
NEW,新建状态,线程被创建出来,但尚未启动时的线程状态;
-
RUNNABLE,就绪状态,表示可以运行的线程状态,它可能正在运行,或者是在排队等待操作系统给它分配 CPU 资源;
-
BLOCKED,阻塞等待锁的线程状态,表示处于阻塞状态的线程正在等待监视器锁,比如等待执行 synchronized 代码块或者使用 synchronized 标记的方法;
-
WAITING,等待状态,一个处于等待状态的线程正在等待另一个线程执行某个特定的动作,比如,一个线程调用了 Object.wait() 方法,那它就在等待另一个线程调用 Object.notify() 或 Object.notifyAll() 方法;
-
TIMED_WAITING,计时等待状态,和等待状态(WAITING)类似,它只是多了超时时间,比如调用了有超时时间设置的方法 Object.wait(long timeout) 和 Thread.join(long timeout) 等这些方法时,它才会进入此状态;
-
TERMINATED,终止状态,表示线程已经执行完成。
基础
ThreadLocal
Future
Callable
AQS 框架
final 关键字和“不变性”
死锁问题
-
互斥条件
-
请求与保持条件
-
不剥夺条件
-
循环等待条件
CAS 原理
-
ABA 问题
-
自旋时间过长问题
-
线程安全的范围不能灵活控制问题
Java 内存模型
-
重排序
-
原子性
-
可见性 happens-before
-
volatile
ThreadPoolExecutor线程池
内置线程池的默认实现
FixedThreadPool 和 SingleThreadPool
允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM
CachedThreadPool 和 ScheduledThreadPool
允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM
核心参数
-
corePoolSize
-
maximumPoolSize
-
keepAliveTime
-
unit
-
workQueue
-
threadFactory
-
RejectedExecutionHandler
-
AbortPolicy
-
CallerRunsPolicy
-
DiscardPolicy
-
DiscardOldestPolicy
-
execute() VS submit()
- submit() 方法可以接收线程池执行的返回值,而 execute() 不能接收返回值
扩展
-
beforeExecute()
-
afterExecute()