ThreadPoolExecutor的workQueue参数

来源:8-3 线程池-3

weibo_小朋打酱油_0

2018-08-13

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

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

写回答

1回答

Jimin

2018-08-13

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

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

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

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

再来看你的问题:

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

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

1
1
spicery
workQueue里有任务,代表当前有maxPoolSize 个线程在执行,这些线程执行的任务结束时, 这里应该改为 “当前有corePoolSize个线程在执行” 吧
2019-04-05
共1条回复

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

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

3923 学习 · 832 问题

查看课程