JAVA 线程池原理,java常见数据结构与算法面试题

其中AtomicInteger变量ctl的功能非常强大:利用低29位表示线程池中线程数,通过高3位表示线程池的运行状态:

  1. RUNNING:-1 << COUNT_BITS,即高3位为111,该状态的线程池会接收新任务,并处理阻塞队列中的任务;
  2. SHUTDOWN: 0 << COUNT_BITS,即高3位为000,该状态的线程池不会接收新任务,但会处理阻塞队列中的任务;
  3. STOP : 1 << COUNT_BITS,即高3位为001,该状态的线程不会接收新任务,也不会处理阻塞队列中的任务,而且会中断正在运行的任务;
  4. TIDYING : 2 << COUNT_BITS,即高3位为010,该状态表示线程池对线程进行整理优化;
  5. TERMINATED: 3 << COUNT_BITS,即高3位为011,该状态表示线程池停止工作;

如何创建线程池

Executors工厂类
  1. Executors.newCachedThreadPool(); 说明: 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.
  2. Executors.newFixedThreadPool(int); 说明: 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
  3. Executors.newSingleThreadExecutor(); 说明:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照顺序执行。
  4. Executors.newScheduledThreadPool(int); 说明:创建一个定长线程池,支持定时及周期性任务执行。

弊端:

  1. FixedThreadPool 和 SingleThreadPool:

允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。 2. CachedThreadPool 和 ScheduledThreadPool: 允许的创建线程数量为 Integer.MAX_VALUE, 可能会创建大量的线程,从而导致 OOM。

ThreadPoolExecutor

虽然上述Executors提供了工具类,但是依然存在可能会导致OOM的问题,我们一般建议采用SDK内部的线程池来创建,同时也可以让使用者了解每个参数的含义,防止出现问题。 SDK内部提供了创建线程池的构造方法,如下:

/**

  • @param corePoolSize:核心线程数;
  • @param maximumPoolSize:线程池允许的最大线程数;
  • @param keepAliveTime:保持活动时间,空闲的线程(普通线程)在超过keepAliveTime时间内没有被复用,就被销毁;
  • @param unit:时间单位;
  • @param workQueue:任务队列,用来存储已经被提交,即将被执行的任务;
  • @param threadFactory:线程工厂,用来创建线程池中的线程;
  • @param handler:拒绝策略,线程池关闭,或者最大线程数和队列已经饱和的情况下,抛出RejectedExecutionExcepti

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

on异常;
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值