请稍等 ...
×

采纳答案成功!

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

ThreadPoolExecutor的workQueue参数

当前线程数 > corePoolSize & < maxPoolSize时,将任务放入workQueue;

请问老师,workQueue中的任务,什么时候被取出来执行?workQueue满了以后,当有任务A再来的时候,是从workQueue中取出任务给线程执行,还是让线程执行当前申请的任务A?

正在回答 回答被采纳积分+3

1回答

Jimin 2018-08-13 22:45:28

你好,我们先来简单归纳一下:

1、当提交任务时,如果运行的线程数量少于corePoolSize,即使当前有线程处于空闲状态(idle),那么仍然会创建一个新的线程来处理提交的任务。

2、如果线程的数量大于corePoolSize并且小于maximumPoolSize,当且仅当队列满了的时候,才会创建一个新的线程来处理提交的任务。

3、如果线程的数量大于maximumPoolSize,那么就会执行相应的拒绝策略。

再来看你的问题:

workQueue满了以后,当有任务A再来的时候,执行的是创建线程池时指定的拒绝策略,因为当前线程池已经大于maxPoolSize + workQueue size了,不能再分配更多的资源了。如果尝试去让一个新的线程去执行,很可能会导致服务器内存不够用。

接下来再说workQueue中的任务什么时候被取出来执行。workQueue里有任务,代表当前有maxPoolSize 个线程在执行,这些线程执行的任务结束时,处于空闲状态,就会取出workQueue中任务执行。这样也体现了线程池调度线程执行的本质。既控制了资源的分配,也控制了线程的调度。

1 回复 有任何疑惑可以回复我~
  • spicery #1
    workQueue里有任务,代表当前有maxPoolSize 个线程在执行,这些线程执行的任务结束时,
    这里应该改为  “当前有corePoolSize个线程在执行” 吧
    回复 有任何疑惑可以回复我~ 2019-04-05 20:39:41
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信