浅析线程池ThreadPoolExecutor

private final ReentrantLock mainLock = new ReentrantLock();//负责线程池变量的修改加锁保证原子性。
private final HashSet<Worker> workers = new HashSet<Worker>();//工作线程集合
private final BlockingQueue<Runnable> workQueue;//任务存储队列
private volatile int corePoolSize; //核心线程池中线程数量
private volatile int maximumPoolSize;//线程池中线程最大数量

工作原理:创建并提交任务submit/execute后,1.假如工作线程数量<核心线程池中的线程数,则创建线程并执行任务

2.假如工作线程数=核心线程池中的线程数,将提交的任务放入workQueue(阻塞队列)

3.假如工作线程数=核心线程池中的线程数 && 任务队列满,将提交的任务放入线程池中

4.线程池到达最大线程数,饱和策略来处理此任务

public void execute(Runnable command) 

工作线程的实现:1.继承了AQS,工作线程对象本身就成为了一个锁   2.实现了Runnable接口,包含一个任务对象

final void runWorker(Worker w) //工作线程在执行任务的时候,将自己加锁。

问:线程池中的线程在完成任务后,如何从阻塞队列中获取需要执行的任务?

private Runnable getTask()    

由此可以看出:多个线程空闲下来,需要拿取队列中任务的时候,因任务阻塞队列的特性

(原理:【ReentrantLock  lock、condition】 ----- 【AQS】 ----- 【CAS、lock的同步队列、condition的等待队列】),保证不会拿到同一个任务,拿出任务的操作原子性。

问:对线程池的操作,如何保证原子性?

对线程池进行所有的操作,全都需要mainLock.lock()。比如:

 

线程池:

ThreadPoolExecutor实现知识点:线程+阻塞队列+ReentrantLock锁+CAS原子操作变量,

阻塞队列的原理也是ReentrantLock的lock(队列进行操作take/poll..的时候,锁住然后出/入队操作)   

condition(出dequeue、入enqueue队操作时,对condition进行等待await/唤醒signal)

ReentrantLock的实现依靠AQS(AbstractQueuedSynchronizer),AQS依靠CAS实现。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值