作者回复: 对的,如果队列满了,就会新增线程来执行任务,如果已经是最大线程数量,则会执行拒绝策略。
这里不应该说不合理,而是不公平。可以深入源码查看具体的实现。
作者回复: 我们先考虑单个环境,再去调优复杂环境。大多情况下,重要的服务会单独部署,尽量减少重要业务的相互影响。如果是核心业务冗余在了一个服务上,建议拆分之后分别部署。
非核心业务,很多业务处理可能是在不同时间点,彼此相互不影响,所以不用过多考虑混合部署服务的情况。
作者回复: 1、如果队列满了,这个现成的任务会创建非核心线程,也就是不会先运行队列中的任务。
2、新来的任务a会通过创建新的线程来运行,只要线程数量小于核心线程数,新来的任务都会通过创建新的线程来运行。直到等于核心线程数,任务将会放到阻塞队列中,通过循环拿到阻塞队列中的任务执行。
作者回复: 适用的,多个进程大部分时间不一定是重合运行的。但具体情况需要具体定,所以最终还是以压测调出来的线程数为准。
作者回复: 我们一般会调整tomcat的线程数量的,线上环境的tomcat线程数量我们一般是在16核CPU的环境下为20左右。如果有万级的并发过来,100以及1000的线程数量,可能会有问题。
作者回复: 在一些非核心业务,我们可以将核心线程数设置小一些,最大线程数量设置为计算线程数量。在一些核心业务中,两者可以设置一样。阻塞队列可以根据具体业务场景设置,如果线程处理业务非常迅速,我们可以考虑将阻塞队列设置大一些,处理的请求吞吐量会大些;如果线程处理业务非常耗时,阻塞队列设置小些,防止请求在阻塞队列中等待过长时间而导致请求已超时。
作者回复: 分别创建。
如果过分彼此相互影响,建议拆开服务,分别部署。
作者回复: 感谢学磊童鞋的提醒,已修正。
答案正确!
作者回复: io为主,通常我们都是设置2*n,例如netty中的io线程池的线程数量默认为2*n
作者回复: 赞,做性能压测的时候会经常遇到这种情况,当某条SQL比较耗时的时候,如果线程数设置过大,就会出现不能打开DB连接的异常。
作者回复: 这个流程图没问题的,在队列满了之后,还会去判断线程池是否能再新增非核心线程,我们具体可以深入源码熟悉线程池的工作原理。
作者回复: 没有到达核心线程数,新的任务进来也会创建线程执行,可以查看源码看到具体的实现
作者回复: 赞
作者回复: 一般是按单机来算线程数
作者回复: 对的
作者回复: cpu密集情况下是n+1,如果是4核的情况下就是4+1。2n+1一般用于io密集的情况
作者回复: 是的,需要初始化