请教通过ThreadPoolExecutor 创建线程池

shjqk 2019-04-28 10:55:42
通过ThreadPoolExecutor 创建线程池,场景是每隔一段时间会同时有一批任务,每个任务都要被处理,希望请求少的时候每个请求马上被线程处理,
但线程池的线程数量最大是100,如果同时处理的线程数大于100,后续的任务都在那等待,直到被处理完
这样的线程池怎么设置?谢谢

static LinkedBlockingQueue queue = new LinkedBlockingQueue();
static ExecutorService service = new ThreadPoolExecutor(0,100,
10, TimeUnit.SECONDS, queue);
...全文
134 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
游北亮 2019-04-28
  • 打赏
  • 举报
回复
你不是知道吗?代码都写出来了, new ThreadPoolExecutor(0,100, 10, TimeUnit.SECONDS, queue); 第一个参数表示核心线程数,就是默认维持的最小线程数量,你把它改成10就可以了, 第二个参数表示允许创建的最大线程数,就是100。
游北亮 2019-04-28
  • 打赏
  • 举报
回复
你直接把 corePoolSize 设置成100,不就完事了, 就是空闲时也会占用100个线程而已。
shjqk 2019-04-28
  • 打赏
  • 举报
回复
如果设置这样的队列,是会开启到最大线程,但后面的任务会出现队列满后被拒绝 现在我在拒绝策略里再做了处理。 就是不知道能不能不通过拒绝策略,直接实现我这样的需求
游北亮 2019-04-28
  • 打赏
  • 举报
回复
看了一下 ThreadPoolExecutor 的源码,里面有注释: * When a new task is submitted in method {@link #execute(Runnable)}, * and fewer than corePoolSize threads are running, a new thread is * created to handle the request, even if other worker threads are * idle. If there are more than corePoolSize but less than * maximumPoolSize threads running, a new thread will be created only * if the queue is full. 当一个新任务提交,并且运行中线程数小于corePoolSize时,会新建一个线程处理请求,即使其它工作线程处于空闲。 如果运行中线程数大于corePoolSize但是小于maximumPoolSize时,只有队列满了,才会创建新线程. 所以你要设置一个有容量限制的队列,如:
        
LinkedBlockingQueue queue = new LinkedBlockingQueue(1);
shjqk 2019-04-28
  • 打赏
  • 举报
回复
引用 1 楼 水边2 的回复:
你不是知道吗?代码都写出来了, new ThreadPoolExecutor(0,100, 10, TimeUnit.SECONDS, queue); 第一个参数表示核心线程数,就是默认维持的最小线程数量,你把它改成10就可以了, 第二个参数表示允许创建的最大线程数,就是100。
但我调试中,现在这样的线程池,如果同时向serive.submit 提交200个任务,只有corePoolSize的线程数同时在做,如果corePoolSize是10,那就是10个线程,做完了再做10个任务,不会开启到最大线程数

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧