请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

线程池

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

正在回答

1回答

你好,这个还是有点问题的。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 回复 有任何疑惑可以回复我~
  • 提问者 blanc_ #1
    谢谢老师 ,这解释的再明白不过了!
    回复 有任何疑惑可以回复我~ 2018-09-05 00:17:18
  • 我觉得这个解释比课程里讲的要清晰。。做为笔记记下来。
    回复 有任何疑惑可以回复我~ 2019-07-18 10:41:54
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信