如何一直从工作队列中源源不断的执行任务
2020-11-02 10:32:48 0 举报
登录查看完整内容
线程池内部原理
作者其他创作
大纲/内容
worker
通过独占锁的方式,安全的加入到workers中,workers的数据结构为hashset
workers(core线程池)
启动worker线程
是
线程数量< coreSize
执行任务的run方法,task.run();
将state设置为0,独占锁的线程设置为null,返回一个true
将任务放入workers中
定义两个变量一个workerStarted和workerAdded都为false
没满
判断传进来的task是否为空
任务
对当前woker对象上一个独占锁
为空
任务开始提交
死循环+cas增加线程数量来保证线程安全
满了
会将提交的任务设置为firstTask,并且会通过默认工厂创建一个worker线程
获取当前线程池线程数量和状态
否
线程总数是否超过最大线程数
LinkedBlockQueue无界的阻塞队列
创建一个worker对象
队列是否已经满了
woker去释放自己的锁,本身自己继承了AQS,重写了释放锁的方法
开始从队列中通过死循环获取
做一些异常状态的校验
当前线程池总数是否大于maxThreads
创建非核心线程
task = null; w.completedTasks++; w.unlock();
会通过take的阻塞式的方式获取任务
不为空
没有超过
会去执行我们提交的任务runWorker()
reject任务的提交
非core线程池
不大于
收藏
0 条评论
回复 删除
下一页