juc-threadpool-threadlocal
2020-06-16 13:33:48 91 举报
线程池 threadlocal
作者其他创作
大纲/内容
shutdownnow()
new Worker(t)
unlockfalse
beforeExecute
AtomicInteger ctl记录的线程数是否小于核心线程数corePoolSize
哈希与获取entry下标
Entry
SHUTDOWN
Worker.run
T value
在将来某个时候执行给定的任务。任务可以在新线程中执行,也可以在现有的池线程中执行。如果无法提交任务供执行,或者因为这个执行器已经关闭,或者因为它的容量已经达到,那么该任务将由当前RejectedExecutionHandler处理。
createMap
Worker
getEntryAfterMiss
添加的是非核心线程
TIDYING
ThreadLocal弱引用
true 核心数,false 最大数
线程池运行中但是没有线程
getTask
pool 空了
map判断
成功直接返回
shutdownnow
否
返回entry.value
循环
实现线程销毁:getTask的时候去判断,先判断线程的转态,如果是shutdown并且(工作队列空或stop状态)则font color=\"#ff0000\
否 即= B
只有获取锁才可以访问set.保存了线程池中所有的worker
自旋
添加核心线程
循环遍历
runWorker
ThreadPoolExecutor :TPEWorker : W
map.set
setInitialValue初始化
否remove(t)从队列中删除即回滚
createMap ---- d.哈希与=0
遍历 下一个不为null的Entry
返回nullcas线程池worker数ctl--
task.run()
获得独占锁后判断线程池的状态是否或者为空。
构建Entry设置扩容值
扩容
哈希与:AtomicInteger.getAndAdd(0x61c88647) & threadlocalmap.lenth-1
运行传入的任务或队列中的任务(task=t)!=null || (task=getTask)!=null
坐标下无值replaceStaleEntry
不为空
Entry1
添加一个空任务继续运行,以此来保证可以继续接收新任务而继续运行
shutdown:优雅,tryLock的方式,成功才去中断shutdownNow 直接中断
run
springboot-tomcat默认线程池的数据minSpareThreads = 10maxThreads = 20060sLinkedBlockingQueue
RUNNING
workQueue.offer(t)讲t放入阻塞队列中
new Worker
statr
坐标下有值替换并返回
execute(t)
workers.remove()自旋线程worker数ctl--
线程池shutdown或队列空
失败(t.false) C
set
Thread thread//线程工厂创建的线程,用来运行任务的。Runnable firstTask//实际需要运行的对象,用户传入的,run直接被调用
是
Thread
addWorker
哈希与得到下标沿着下标向后遍历
++成功
pool和queue空了
reject(t)拒绝策略
Entry0
执行失败
空
start()
ReentrantLock.lock
ThreadLocal<Integer> d = new ThreadLocal<>();
isRunning(ctl.get)线程池处于RUNNING状态
Entry15
执行失败-D
线程池中使用AtomicInteger来实现线程名字的顺序
get
Entry2
阻塞队列
afterExecute
ThreadLocalMap.getEntry
Factory().newThread(this)
set---- 哈希与= 2
STOP
判断是否需要中断
采用自旋for(;;)和CAS更新线程池的worker数量ctl++
HashSet<Worker> workers.add(w)
shutdown()
是否空
get 和 set 都回判断,为空的时候就会初始化createMap
ThreadLocal<String> s = new ThreadLocal<>();
unlocktrue
execute
getMap(currentThread)
添加工作线程数
ThreadLocalMap
TERMINATED
构建工作线程
........
0 条评论
下一页