使用多个线程池还是一个线程池

最近在技术理论上遇到一个问题,不知道怎么解决。
问题描述:我们交易平台有4个商品(A、B、C、D)需要进行现在交易,交易的核心方法dealorder是
一个加了锁和事务的方法,而且该类是针对每一个商品的,即最多同时可以执行4个dealOrder方法,即每个商品执行一个该方法。

 @Transactional
    public synchronized Message dealOrder()

CPU核心数是固定的,假如为6核心,目前就存在一个问题,
情况1:假如说创建一个线程池,过来了大量的A商品请求,超过6个就被放进了队列中,再过来B、C、D商品的请求,也无法再进行处理。
情况2:假如说创建6个线程池,每个商品一个线程池,这时候,理论上ABCD四个商品就会在各自的线程池中进行处理,这样就不会发上1情况的其他商品等待资源释放的问题,但是真实情况下,6个线程池会去抢占一个CPU获得处理还是自动获取6个CPU核心数进行处理.
我现在没有理论上的经验,通过实践似乎可以看出来2情况要理想,但是真实情况下是否如此,真心需要理论上给出结论。

非常感谢你的回答,我一直没有弄清楚CPU核心数和4个线程池(每个里面一个线程),和一个线程池(里面4个线程)之间的关系,只是情况2解决了
大量A商品(A1A2A3A4A5A6、B1B2)这中请求的时候,B1不需要等待A1A2处理完后再进入线程池,而会直接进入到B商品的线程池进行处理,但是
我一直怀疑真实情况下,CPU在处理1个线程池(多个线程),多个线程池(1个线程)之间的内存分配和CPU调度之间的关系,非常迫切希望您能多聊聊一些知识。

线程池的设计,也要因地制宜。

我觉得你的这个问题,如果ABCD的数量不多,一个线程或者就利用系统的线程池就可以了。

如果处理总数很频繁,ABCD谁多谁少不确定,并且ABCD都要操作一个资源(例如某数据表:Cargo),一个线程池就够了。
这个时候,你还得自己给线程池写线程的调度算法。

如果每个类中的消息都很多频繁,且每种商品都会操作一种资源(例如每种商品都有一张数据表),这个时候可以为每个商品弄一个线程池。

假设 CPU核心数 6 既然使用线程池那肯定有并发量 假设线程池满负荷

  1. 使用多个线程池
    每个线程池设置核心线程数6 最大线程数6 那4个线程池就是24个线程数 也就是说同一时间有24个线程抢占cpu时间片,来让自己优先得到宠幸,此时多个业务线可以同时得到执行用户不用等待,但增加了线程切换的时间消耗,也就是用时间来换空间,服务吞吐量下降。

  2. 使用一个线程池
    线程池设置核心线程数6 最大线程数6 和1正好相反 多个业务线都同时抢占一组线程,抢到的先执行,抢不到的排队,但线程数少不用分心切换线程时的销号,CPU资源得到充分利用,服务吞吐量大,平均响应时间缩小,但运气不好的业务线需要排队好长时间。

    • 所以一般情况下都是用一个线程池 已达到最大的服务器吞吐性能,单位时间内服务更多用户。
    • 二般情况 Spring Cloud Hystrix的线程池隔离一般是使用多个线程池 , 这样单个业务线挂了,上游服务调用请求阻塞在一个线程池里,对其他业务线不会有影响。
    • 使用一个线程池的优化 当共享一个线程池时 ,如果一个线程被返还,这个时候只能从队列中取出一个待执行的线程也就是排到后面有运气不好的能排到天荒地老,可以重写一个线程池调度,把一个队列拆分成多个小队列,把池中的线程分组绑定到其中的一个个小队列中,露雨均沾。
      回到你的问题
      你的交易方法加了个锁,那为什么还要用多线程,先并发再单发?

一个,你创建那么多,也不可能都在运行,系统会调度的

多个线程池跟一个线程池有啥区别,处理是在线程中跑 ,当然估计 你的自己写线程池 ,在里面重新定义原子操作 系统的估计不咋好使

如果A,B,C,D本身就没什么区别,都是作为一个处理对象,那么开一个线程池,里面放CPU个数*2,这么多线程,这样可以比较最大化利用线程池和CPU的能力。

CPU的核数与线程数和线程池数没有必然关系。.net本身就为应用程序分配了一个线程池,我们常用的方法的异步调用就是将调用的.net应用程序线程池来跑的。

之所以我们自己要创建线程池,是因为一类的操作要访问一些资源,而这些资源在切换的时候比较消耗时间,所以把这一类操作给一种线程池来处理,这样更快。

CPU的核数属于系统资源,它的分配是由操作系统按照一定的算法按时间片分配的。不会让应用程序来控制,不然,你一个线程池的几个线程老占着一个核不放,它在很闲的时候,这个核岂不废了。

一但一个线程启动了,他就等于把它交给操作系统了。至于要给哪个核处理,应用程序是管不了的,我们只需要在应用程序中做好资源访问的控制,线程的等待等操作就行了。

A、B、C、D是有优先级吗?