线程池

来源:8-1 线程池-1

blanc_

2018-09-04

请问老师,当正在处理的线程数大于等于corePoolSize,但是workQueue未满的情况下,是不是提交的任务会放到workQueue中直到workQuque也满的情况下才会去创建新的线程

写回答

1回答

Jimin

2018-09-04

你好,这个还是有点问题的。workQuque满的时候要执行RejectedExecutionHandler 所指定的策略。

这里的关系我整个发一下,希望有助于你的理解:

1)如果此时线程池中的数量小于 corePoolSize(核心池的大小) , 即使线程池中的线程都处于空闲状态, 也要创建新的线程来处理被添加的任务(也就是每来一个任务, 就要创建一个线程来执行任务) 。

2)如果此时线程池中的数量大于等于 corePoolSize, 但是缓冲队列workQueue 未满, 那么任务被放入缓冲队列, 则该任务会等待空闲线程将其取出去执行。

3)如果此时线程池中的数量大于等于 corePoolSize , 缓冲队列workQueue 满, 并且线程池中的数量小于 maximumPoolSize(线程池最大线程数) , 建新的线程来处理被添加的任务。

4)如果此时线程池中的数量大于等于 corePoolSize, 缓冲队列workQueue 满, 并且线程池中的数量等于 maximumPoolSize, 那么通过RejectedExecutionHandler 所指定的策略(任务拒绝策略)来处理此任务。也就是处理任务的优先级为: 核心线程 corePoolSize、 任务队列workQueue、 最大线程 maximumPoolSize, 如果三者都满了, 使用handler 处理被拒绝的任务。

特别注意, 在 corePoolSize 和 maximumPoolSize 之间的线程数会被自动释放。 当线程池中线程数量大于 corePoolSize 时, 如果某线程空闲时间超过 keepAliveTime, 线程将被终止, 直至线程池中的线程数目不大于 corePoolSize。 这样, 线程池可以动态的调整池中的线程数。

2
2
慕粉13951610073
我觉得这个解释比课程里讲的要清晰。。做为笔记记下来。
2019-07-18
共2条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程