java 线程池中的状态转换 - 使用位运算表示状态

java 线程池中的状态转换

需要表示2种类型的状态, 1种是线程池是否在运行中, 1种是线程池中的有效线程数目.

java源代码中, 并不使用2个变量来分别表示上面的状态, 而是使用1个整数来表示. 为此, 线程池限制了最大的线程数目为 (2^29)-1 而不是 (2^31)-1. 这样做的目的是使代码更快, 更简单.

线程有以下的状态:

  • RUNNING: 接受新的任务并处理队列中的任务
  • SHUTDOWN: 不接受新的任务,但是继续处理队列中的任务
  • STOP: 不接受新的任务,也不处理队列中的任务,并中断当前的任务
  • TIDYING: 所有的任务都停止, workerCount 为 0 , 线程转换为 TIDYING 状态, 将会执行 terminated() 钩子方法
  • TERMINATED: terminated() 调用完成

为了比较状态, 数字顺序是有用的. runState 是单调递增的:

  • RUNNING -> SHUTDOWN
    调用 shutdown() 的时候触发, 可能隐式地在 finally 块中调用
  • (RUNNING or SHUTDOWN) -> STOP
    调用 shutdownNow() 的时候触发
  • SHUTDOWN -> TIDYING
    当 任务队列 和 线程池 都为空的时候
  • STOP -> TIDYING
    当 线程池为空的时候
  • TIDYING -> TERMINATED
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值