【JUC】ThreadPoolExecutor线程池控制状态ctl_threadpoolexecutor的ctl字段

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

为了将它们打包成一个int,将workerCount限制为(2^29) -1(约5亿) 线程,而不是(2^31)-1(20亿)。如果将来出现这个问题,可以将变量更改为AtomicLong,并调整下面的shift/mask常量。

但是在需要之前,这段代码使用int会更快更简单一些。workerCount是允许启动而不允许停止的工人数量。该值可能与活动线程的实际数量暂时不同,例如,当ThreadFactory在被要求创建线程时失败,以及退出的线程在终止之前仍在执行簿记时。用户可见的池大小报告为工作集的当前大小。

runState提供了主要的生命周期控制,取值如下:

  • RUNNING:接受新任务和进程排队的任务
  • SHUTDOWN:不接受新任务,但进程排队的任务
  • STOP:不接受新任务,不处理排队的任务,并中断正在进行的任务
  • TIDYING:所有任务都已终止,workerCount为零,线程转换到TIDYING状态将运行terminate()钩子方法terminate。

这些值之间的数字顺序很重要,以便进行有序比较。runState单调地随时间增加,但不需要达到每个状态。
状态之间转换:
在调用SHUTDOWN()时,可能隐含在finalize()中(RUNNING或SHUTDOWN) -> STOP在调用shutdownNow()时,SHUTDOWN -> TIDYING当队列和池都为空时,STOP -> TIDYING当池为空时,TIDYING -> terminate当terminate()钩子方法完成时,在awaitTermination()中等待的线程将在状态达到terminate时返回。检测从SHUTDOWN到TIDYING的转换并不像想的那么简单,因为在SHUTDOWN状态期间,队列可能在非空之后变为空,反之亦然,但是我们只能在看到队列为空之后,看到workerCount为0时终止。

private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
    private static final int COUNT\_BITS = Integer.SIZE - 3;
    private static final int CAPACITY   = (1 << COUNT\_BITS) - 1;

    // runState is stored in the high-order bits
    private static final int RUNNING    = -1 << COUNT\_BITS;
    private static final int SHUTDOWN   =  0 << COUNT\_BITS;
    private static final int STOP       =  1 << COUNT\_BITS;
    private static final int TIDYING    =  2 << COUNT\_BITS;
    private static final int TERMINATED =  3 << COUNT\_BITS;

    // Packing and unpacking ctl


**深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

![](https://img-blog.csdnimg.cn/direct/743b668910224b259a5ffe804fa6d0db.png)
![img](https://img-blog.csdnimg.cn/img_convert/0c4085e9f9e40baec10692d7adc38780.png)
![img](https://img-blog.csdnimg.cn/img_convert/97ace5afac6eb50f734ad724798c5bc7.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**

化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThreadPoolExecutor 是 Java 中的一个线程池实现,它提供了一种管理线程的机制,可以有效地控制线程的数量,避免因为线程过多而导致系统资源的浪费和性能下降。 ThreadPoolExecutor 的主要构造函数如下: ``` public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) ``` 其中,各个参数的含义如下: - `corePoolSize`:核心线程数,即线程池中保持的最少线程数。 - `maximumPoolSize`:线程池所能容纳的最大线程数。 - `keepAliveTime`:线程池中超过 `corePoolSize` 的空闲线程能够存活的最长时间。 - `unit`:`keepAliveTime` 的时间单位。 - `workQueue`:任务队列,用于保存等待执行的任务。 - `threadFactory`:线程工厂,用于创建新线程。 - `handler`:拒绝策略,用于当任务队列满了且当前线程数已达到最大线程数时如何处理新任务。 ThreadPoolExecutor 在初始化时会创建 `corePoolSize` 个线程,并将剩余的任务添加到任务队列 `workQueue` 中。当任务队列满了时,如果当前线程数小于 `maximumPoolSize`,则会创建新的线程来执行任务;如果当前线程数已达到最大线程数,则会根据拒绝策略 `handler` 来处理新任务。 ThreadPoolExecutor 还提供了一些方法,如 `execute()`、`submit()`、`shutdown()` 等,用于提交任务、关闭线程池等操作。需要注意的是,当使用完线程池后,应该及时调用 `shutdown()` 方法来关闭线程池以释放资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值