高并发基础——Executor 线程池框架(二)

工作线程池

在 ThreadPoolExecutor 的内部实现中,工作线程池通过 HashSet 实现。在ThreadPoolExecutor 内部对 HashSet 集合内部的数据节点进行增删操作时,通过 ReentrantLock 加锁来实现,保证线程安全问题。

//Worker 为工作线程的包装类
private final HashSet<Worker> workers = new HashSet<>();
//实现线程增删的线程安全的锁
private final ReentrantLock mainLock = new ReentrantLock();

Worker类

继承于AbstractQueuedSynchronizer(AQS):

基于AQS的状态变量 state 来定义当前线程的工作状态,并且可以以线程安全的方式对该状态进行检查和更新。

实现 Runnable 接口:将该worker 线程对象自身作为一个 task 放到 Worker 内部的线程对象 thread 去执行,在 run 方法中定义该工作线程的工作逻辑。

任务的提交

使用 execute 或者 submit 方法来提交任务,execute 方法没有返回值,submit 方法使用 Future 对象作为返回值,可以通过该对象来跟踪这个任务的执行和获取执行结果。

任务提交流程:

  1. 如果线程池中的线程数少于corePoolSize,则创建一个新线程来执行该任务

  2. 若线程数达到了corePoolSIze,则将任务放到 workQueue 中。线程池中存在空闲线程时,空闲线程会从任务队列中取出任务并处理

  3. 若任务等待队列 workQueue 也满了时,如果线程池当前工作线程数小于 maximumPoolSize,则创建新线程执行该任务。

  4. 否则调用 reject 方法,根据具体的任务拒绝策略处理该任务。任务拒绝策略默认为 AbortPolicy,即在 execute 方法抛异常。

    • 任务拒绝策略:AbortPolicy:抛 Abort 异常;CallerRunsPolicy:在主线程直接执行该任务;DiscardPolicy:默默丢弃该任务;DiscardOldestPolicy:移除任务等待队列队头的任务,将该任务添加到队列中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值