采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
请问老师,当正在处理的线程数大于等于corePoolSize,但是workQueue未满的情况下,是不是提交的任务会放到workQueue中直到workQuque也满的情况下才会去创建新的线程
你好,这个还是有点问题的。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。 这样, 线程池可以动态的调整池中的线程数。
谢谢老师 ,这解释的再明白不过了!
我觉得这个解释比课程里讲的要清晰。。做为笔记记下来。
登录后可查看更多问答,登录/注册
构建完整并发与高并发知识体系,倍增高薪面试成功率!
1.7k 1
1.1k 18
1.1k 15
3.5k 12
1.2k 12