问题描述
最近在研究线程池的相关内容,因为没有在实际开发中使用过线程池,所以特提出以下几个问题,望高手解答。
题目描述
问题1、什么场景下使用线程池,主要解决什么问题?
问题2、一个线程池,设置参数coreSize=5,maxSize=10,blockQueueSize=10,依次提交6个比较耗时的任务,线程池是如何执行的?
问题3、场景模拟:一个支付场景,A接口需要调用微信支付接口完成支付任务,调用微信支付接口被放在一个线程池中执行,假如微信接口的超时时间是2s,A接口的qps大概是100,如何设置线程池参数比较合适?如果涉及到突发流量的场景,如何设置?
首先最直接的,代码中存在
new Thread().start
这类的硬编码,甚至是在 for 循环中调用,这类代码强烈要求改为线程池。场景:当遇到需要异步执行任务的时候可用线程池,或者是批量执行某个任务,需要提高单线程的执行效率可考虑换为多线程(但需要考虑共享资源及锁带来的影响)
主要解决以下问题:
线程池的执行过程简单来说分为以下几步:
maxSize
。这几步,具体过程建议查看这几篇:
线程池中涉及到一些耗时任务,比如这里的调用微信最大为 2s,说明同一时刻不是所有线程都在执行,有部分会在等待微信接口的响应;所以可以适当增加线程池的数量。
A 接口的 QPS 要求为 100 ,意味着当同一时刻有 100 个请求过来时需要都能接收处理并响应,假设这个接口中最耗时的任务为调微信;所以调用微信这里的线程池中的阻塞队列最小得为 100 ,才能缓冲最坏情况(大家都在等待微信返回时),同时 A接口还能正常向上游响应。
至于突发流量,一般都是在入口处做缓冲,这里其实和线程池关系不大(有可能在调微信之前的业务逻辑就撑不住了);所以一般可以在入口加上限流、也可用 MQ 来削峰。