ThreadPoolExecutor.execute()
2020-08-25 10:32:34 0 举报
ThreadPoolExecutor线程池执行调用过程
作者其他创作
大纲/内容
如果当前工作线程大于核心线程数,则允许阻塞时间为keepAliveTime,超时后还获取不到任务则返回null,外部检测task = null会结束线程,这个就是非核心线程销毁的原理
into
队列已满(入队失败)
ctl (工作线程) < corePoolSize
N
workQueue.offer() 入队
workQueue.poll(keepAliveTime)
task != null
Y
workQueue.take()
addWork()
task = getTask()从队列中获取任务(阻塞)
new一个Work对象,将用户实际需要执行的task作为构造参数扔进去,在Work对象的内部有两个重要的属性:1.thread,2.firstTask。firstTask指向真实的task,thread是线程工厂创建出来的一个新线程对象,该线程对象将该Work包装了一层,调用thread的start()方法时实际上会调用Work的run()方法,而Work的run()方法调用的是firstTask的run()方法
runWorker(w)
如果当前工作线程小于等于核心线程数,则使用task()获取任务,即获取不到任务时会一直阻塞,直到获取到任务。因此核心线程不会销毁
task.run()
w.run()
ThreadPoolExecutor.execute()
ctl (工作线程) < maximumPoolSize
reject()执行拒绝策略
ExecutorService.execute()
该线程结束
Runnable task = w.firstTask
ctl (工作线程) > corePoolSize
CAS操作将ctl (工作线程) + 1
Worker w = new Worker(task)
task = null
w.thread.start()
0 条评论
回复 删除
下一页