Java8 线程池 ThreadPoolExecutor

目录

 

  1. 准备知识:补码负数移位,停止一个线程
  2. 线程池的初始参数
  3. 线程池状态
  4. worker
  5. ctl参数
  6. 新增task流程
  7. 线程池最佳实践

 

补码负数移位计算

补码没问题,负数补码也没问题,但是负数(补码格式) 的移位计算把我搞晕了

有符号补码的移位运算规则:

左移右边补0,右移左边补符号位

 

停止一个线程

启动线程很熟悉,对停止一个线程不太熟悉

  1. 如果线程的任务执行完了,会自动停止
  2. Thread.stop方法强制停止一个线程。但是这个方法已经deprecated了。因为此方法会导致线程马上放弃已持有的锁。如果线程当时正在持有锁并执行事务操作,突然失去锁有可能导致程序的线程不安全。
  3. 如果一个线程是while循环的消费者,正常情况不会自动停止。可以使用thread.interrupte或者控制变量。那么在while循环操作的开头就判断线程的中段状态或者控制变量的值,判断后跳出循环,这样就可以停止线程。如果线程处于wait/sleep/join,使用interrupt会导致线程抛出异常,在处理异常的时候也可以让线程跳出循环,停止线程。

 

线程池的初始参数

  1. corePoolSize,核心线程数。每次有新的task的时候,如果线程池的线程数 < 核心线程数,则会新建线程成为核心线程。核心线程在task执行完后不会销毁,成为while循序的消费者,一直从workQueue中取task
  2. maximumPoolSize,最大线程数。有新的task,而且核心线程已经用完了,会新建线程,执行完task后销毁。
  3. keepAliveTime,如果设置了核心线程不能一直alive,则线程空闲超过这个时间后,需要销毁
  4. workQueue,存储不能立即处理的task的queue
  5. threadFactory,线程工厂
  6. handler,对于不能处理的task(线程池已经关闭或者workQueue已经满负荷),此handler处理这种情况

 

线程池的状态

  1. running,运行中
  2. shutdown,调用了线程池的shutdown方法。此状态不会再接收新的task,但是已有的task会继续执行
  3. stop,调用了线程池的shutDownNow方法。此状态不会再接收新的task,而且会取消workQueue中的task,还会中断正在执行的task(中断不能保证一定能让线程停止)
  4. tidying,task都已经停下来了。workQueue也空了,之后会调用terminated方法
  5. terminated,terminated方法执行完了

worker

Worker对象维护了一个线程和一个task的关系。Worker还实现了线程池的shutdown/stop方法(参考 “如何停止一个线程”)。

线程池中Worker的数量参考参数corePoolSize和maxiumPoolSize

 

ctl属性

ctl属性是一个32位的整数,前3位保存了线程池的姿态

  1. 111 (-1),running
  2. 000 (0),shutdown
  3. 001 (1),stop
  4. 010  (2),tiding
  5. 011 (3),terminated

后29位表示线程池中Worker的数量

 

新增task流程

execute方法:
  1. 核心线程数 < corePoolSize,增加worker,worker会去线程工厂拿一个新线程
  2. 1不满足,将task入workqueue
  3. 如果workQueue也进不去,最后再尝试新增一个worker
  4. 1,2,3都失败了,拒绝这个task

shutdown流程

逐一中断空闲的worker(worker是一个AbstractQueuedSynchronizer对象,如果worker在执行task之前会调用worker.lock上锁,没有锁的则表示worker是空闲的)。worker在取新task的时候也会先判断线程池状态,如果是shutdown,则会跳出循环,自动停止

 

shutdownNow流程

中断所有的worker,不管他是不是空闲的

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值