图集
2020-02-19 15:21:59 0 举报
图集,整理各种源码相关原理图
作者其他创作
大纲/内容
子线程
执行决绝策略reject(command)
after
node
head
finally
是否超过核心线程数
next
prev
lock
1. lock.lock()
自循环执行任务runWorker(Worker w)
5. condition.signal唤醒等待线程
否
AQS增加一个node时的变化
3. 其他线程释放锁后,下一个线程争抢lock
是
aduitLogService.pull(aduitLog);
restTemplate.post
offer
提交线程任务execute(Runnable command)
loop
单独的一个线程一直在循环获取队列的值,没值时可以设置睡眠时间int batchSize = 0;while(true){ aduitLog = poll(); if(aduitLog !=null ){ aduitLogDao.save(aduitLog); batchSize++; }else{ sleep } if(batchSize == 100){ aduitLogDao.flush(); batchSize=0; }}
将任务添加到等待队列workQueue.offer(command)
4. 获取lock成功
signalThread
已满
CAS设置尾部节点
队列是否有值
AQS删除一个node时的变化
往队列插入数据
创建font color=\"#ff0080\
是否超过最大线程数
tail
线程池工作线程:HashSet<Worker> workers = new HashSet<Worker>()
AduitLog aduitLog =new AduitLog();aduitLog .setId(uuid);aduitLog .setRequestBody(xxx);
awaitThread
日志异步缓存队列
aduitLog .setResponseBody(xxx);
ThreadPoolExecutor 执行原理分析
condition
4 .取出排在头部的线程进入同步队列
AQS同步队列
维护一个消费AduitLog的单线程
poll
未满
condition等待队列
queueArrayBlockingQueue
打开线程栅栏,让消费线程继续
aduit log service
2. 获取lock失败后,加入同步队列,等待锁的释放
AQS
Thread.start(()
Thread.start()
save DB
线程栅栏处等待
3. condition.await()后进入等待线程,并释放锁
2. 获取lock成功
log aspect
从队列取值
0 条评论
下一页