JAVA线程及线程池要点

线程状态

start
阻塞
阻塞解除
创建
就绪
运行
死亡
阻塞

多线程中可以实现唤醒和等待的过程,但是这不是针对Thread类或对象,而是设置的共享对象

线程池原理

不是
不是
不是
提交任务
核心线程池是否已满
创建新的线程执行任务
待执行任务队列是否已满
线程池是否已满
饱和策略处理
放入待执行任务队列
  • 在核心线程池未满的情况下,新提交的任务总是新建线程执行
  • 超过核心线程池大小的空闲线程在keepAliveTime之后将被终止,但是,核心线程池在keepAliveTime大于0的情况下,也是可以使用timeout策略

线程池状态

shutdown()
shutdownnow()
running
shutdown
阻塞队列清空,剩下任务执行完成
stop
阻塞队列清空,剩下任务终止
tidying
terminated

线程池分类

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

阻塞队列

ArrayBlockingQueue

LinkedBlockingQueue

DelayQueue

PriorityQueue

SynchronouseQueue

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值