线程池源码解读

常见线程池:
FixedThreadPool
SingleThreadPool
CachedThreadPool
ScheduledThreadPool
阻塞队列:
LinkedBlockingQueue  无界队列
SynchronousQueue   同步队列
DelayedWorkQueue  延迟队列

线程池参数    核心线程数   最大线程数    空闲时间    阻塞队列    饱和策略
饱和策略:
AbortPolicy:默认的饱和策略,直接抛出异常,阻止系统工作;
CallerRunsPolicy:只要线程池未关闭,该策略直接在调用者线程中运行当前被丢弃的任务,调用者线程性能可能急剧下降;
DiscardOldestPolicy:丢弃队列里最近的一个任务,执行当前任务;
DiscardPolicy:不做任何处理,直接丢弃该任务。

1、创建线程池,线程池初始化状态
new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS,
                            new LinkedBlockingQueue<>(32), new ThreadPoolExecutor.CallerRunsPolicy());
线程池初始化状态:实际调用父类的构造方法,
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), handler);
初始化defaultThreadFactory;核心线程未启动,任务队列为空
线程池状态:
RUNNING 允许提交并处理任务
SHUTDOWN 不允许提交新的任务,但是会处理完已提交的任务
STOP 不允许提交新的任务,也不会处理阻塞队列中未执行的任务,并设置正在执行的线程的中断标志位
TIDYING 所有任务执行完毕,池中工作的线程数为0,等待执行terminated()勾子方法
TERMINATED terminated()勾子方法执行完毕

2、线程池execute
1、判断运行线程数是否小于corePoolSize,是就创建新线程,并运行任务
2、如果运行线程数大于corePoolSize,任务入队列,触发双重校验(线程池是否已经STOP,或者SHUTDOWN状态,是则拒绝任务,删除已入队任务)
3、如果添加任务失败,直接运行任务(最大线程数,以非核心线程运行)
    int c = ctl.get();
    if (workerCountOf(c) < corePoolSize) {//判断运行线程数是否大于corePoolSize
        if (addWorker(command, true))//创建新线程
            return;
        c = ctl.get();
    }
    if (isRunning(c) && workQueue.offer(command)) {//线程是否运行状态,添加队列成功
        int recheck = ctl.get();
        if (! isRunning(recheck) && remove(command))//线程非允许状态,移除队列任务
            reject(command);//拒绝任务
        else if (workerCountOf(recheck) == 0)//活动线程为空,添加空任务
            addWorker(null, false);
    }
    else if (!addWorker(command, false))//添加任务失败,已非核心线程运行
        reject(command);//拒绝任务

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值