前言:
个人认为根据业务进行调整参数并不难,随便聊聊,给大家抛砖引玉,可以提供一下思路
正文:
先按照公式,比如cpu密集型就设置为 核心数+1,如果是io密集型就是设置为 核心数*2,混个型任务可以具体拆分到不同线程池执行(当然还有其他的公式我这里就不细说了,因为线程池这东西并不是靠公式就能计算出最优解的,要看具体业务进行分析)
2025-10-25T03:39:04.png
然后压测看一下,比如:
1.如果cpu标高的话核心线程数就要减少一点了,因为这时候说明cpu时间轮频繁的切换,减少核心线程数就可以让cpu每个核心集中处理几个任务,这样就可以减少cpu的一个使用率了
2.如果是cpu没有飙高当时任务执行很慢,队列都满了一直走异常抛出策略的话就可以把核心线程数增加一点,因为这样说明你的线程池任务都是io密集型的,比如要等待mysql的返回数据或者其他网络传输等等,这时候是不需要cpu处理的,cpu压力很小,可以适当的增加核心线程数,让他可以同时处理更多的任务
3.最后经过不断的调整选择一个最优解,但是不要片面!最好要是全局最优的,因为你这一个程序不能说只考虑你这个线程池,还要考虑人家其他任务的线程池,所以要整体做一个取舍,让整个系统效率做到比较高就可以
4.当然还可以动态线程池,比如你线上有问题,可以实时的动态调整线程参数,自己实现一个动态线程池也很简答啊,根本不难,知道怎么动态设置线程数量和查看当前线程池的核心线程、最大线程、等待队列等等的指标、,然后封装成接口,抛给前端,写一个动态线程池的调整页面,前端就可以在页面上看到线程池的状态手动进行调整,有啥难的???(可能个人技术受限没有考虑到更深层面的,欢迎大佬批评指正)
动态线程池以及线程数量调优也可以参考 美团技术这篇进行参考:https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html
总结:
设置线程池参数并不难,要根据业务进行压测得出,然后在调整一下做到整体最优,不要只看你自己这一个线程池,导致系统中只运行你这一个线程池的时候效率很好,其他人的线程池一起用就炸了。。也可以用动态线程池实时调整,比如举个实战案例吧 周日晚上用户量很高的时候把语音房中的线程数量增加(因为我每周日邮箱都能收到系统告警,周日晚上活跃用户很多),其他的边缘业务线程池数量可以相对减少
还有考考你,线程池参数中等待队列和拒绝策略你是怎么根据业务场景设置的?(你自己也有点思考好吧,我不想让你看完我这边什么收获都没有,提示:队列大小、OOM、线程池1秒处理量、实时性等方向考虑)