线程状态
多线程中可以实现唤醒和等待的过程,但是这不是针对Thread类或对象,而是设置的共享对象
线程池原理
- 在核心线程池未满的情况下,新提交的任务总是新建线程执行
- 超过核心线程池大小的空闲线程在keepAliveTime之后将被终止,但是,核心线程池在keepAliveTime大于0的情况下,也是可以使用timeout策略
线程池状态
线程池分类
ThreadPoolExecutor
- newCachedThreadPool
- newFixedThreadPool
- newSingleThreadExecutor
ScheduledThreadPoolExecutor
- newScheduledThreadPool
- newSingleScheduledThreadExecutor
ForkJoinPool
- newWorkStealingPool
线程池排队策略
Direct Handoffs (e.g. SynchronouseQueue)
- 读写互锁,只有写入才能读取,读取才能写入
- 需避免设置最大线程池大小,否则,容易导致拒绝新提交任务
- 在处理一系列具有内部依赖关系的请求时,可以避免锁定
Unbounded queues (e.g. LinkedBlockingQueue)
- 无限制队列,线程池中的线程不会超过核心线程池大小
- 适用于任务相互独立,比如web请求,排队的速度超过处理的速度
Bounded queues(e.g. ArrayBlockingQueue)
- 通过设置有限的线程来避免资源被耗尽
- 需要同时考虑队列和线程池大小,控制、调优相对来说比较困难
- 大队列,小线程池可能导致较低的吞吐量;较小队列,通常需要较大的线程池,从而增加线程调度负担,也会影响吞吐量
线程池拒绝策略
当Executor处于shutdown状态或者已经超出最大线程池大小,将使用reject策略,拒绝策略分为四类:
- 中止策略(AbortPolicy)
- 调用者运行策略(CallerRunsPolicy)
- 丢弃策略(DiscardPolicy)
- 丢弃最老的任务策略(DiscardOldestPolicy)
线程池终止(Finalization)
- 线程池不再使用,并且没有线程(含核心线程),将自动终止
- 如果想在不调用shutdown的情况下,不再使用的线程池自动终止,需要设置allowCoreThreadTimeOut