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

问题描述

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

最近在技术理论上遇到一个问题,不知道怎么解决。
问题描述:我们交易平台有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调度之间的关系,非常迫切希望您能多聊聊一些知识。

解决方案三:

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

解决方案四:

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

解决方案五:

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

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

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

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

解决方案六:

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

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

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

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

时间: 2024-10-13 06:52:43

多线程-使用多个线程池还是一个线程池的相关文章

多线程间,变量可见性问题。一个线程会永远看不到另一个线程的更新吗?

问题描述 多线程间,变量可见性问题.一个线程会永远看不到另一个线程的更新吗? 作者说,由于读线程可能永远发现不了main对ready变量的修改就会永远循环下去,但是貌似不太可能永远读不到main对ready变量修改之后的值吧,可能会由于从栈区复制回堆区时,有几毫秒的误差,read线程读到的是旧值,但堆区值更新之后,read线程就读到了新值了吧,为什么说会永远循环下去呢? 解决方案 再回去又读了一遍,有如下解释: 根据JVM设置,如果设置成server模式会有指令重排,如上述循环判断就会变成if(

多线程-C++怎么在一个进程里创建一个线程

问题描述 C++怎么在一个进程里创建一个线程 大家好,我用CreateProcess创建了一个进程,进程的句柄可以获取到, 请问能否通过此句柄创建一个此进程的子线程? 如果可以,如何实现? 多谢. 解决方案 createremotethread apihttp://blog.163.com/lhc__721721/blog/static/639133252010622359175/ 解决方案二: 创建一个线程创建一个线程vc创建一个线程和销毁的方法 解决方案三: 在程序中创建另一个进程的线程,要

两个线程同时操作一个集合,一个线程读,一个线程写。有可能会产生并发问题吗?

问题描述 两个线程同时操作一个集合,一个线程读,一个线程写.有可能会产生并发问题吗? 我下面的代码为啥没有并发问题? 请哪位大神指导下 class Program { public Thread Threadone; public Thread Threadtwo; public event EventHandler EventRun; public static object obj=new object(); ArrayList ListArry = new ArrayList(); pri

MFC跨线程调用另一个线程函数执行的函数

问题描述 MFC跨线程调用另一个线程函数执行的函数 MFC跨线程调用另一个线程函数执行的函数,怎么得到函数的返回值呢?函数名转换函数值 解决方案 http://blog.csdn.net/hebezai/article/details/3529736 解决方案二: 跨线程调用MFC成员函数

java 一个线程控制另一个线程

两种方法,一个用标记变量,另一个用语法 不多说,直接代码: 主方法一:         send s = new send();         s.start();         receive r = new receive();         r.start(); class send extends Thread {         public void run() {             //睡眠计数             int s = 0;             //

《Java多线程编程核心技术》——1.7节停止线程

1.7 停止线程停止线程是在多线程开发时很重要的技术点,掌握此技术可以对线程的停止进行有效的处理.停止线程在Java语言中并不像break语句那样干脆,需要一些技巧性的处理.使用Java内置支持多线程的类设计多线程应用是很常见的事情,然而,多线程给开发人员带来了一些新的挑战,如果处理不好就会导致超出预期的行为并且难以定位错误.本节将讨论如何更好地停止一个线程.停止一个线程意味着在线程处理完任务之前停掉正在做的操作,也就是放弃当前的操作.虽然这看起来非常简单,但是必须做好防范措施,以便达到预期的效

Java多线程:“基础篇”10之线程优先级和守护线程

1. 线程优先级的介绍 java 中的线程优先级的范围是1-10,默认的优先级是5."高优先级线程"会优先于 "低优先级线程"执行. java 中有两种线程:用户线程和守护线程.可以通过isDaemon()方法来区别它们:如果返回false, 则说明该线程是"用户线程":否则就是"守护线程". 用户线程一般用户执 行用户级任务,而守护线程也就是"后台线程",一般用来执行后台任务.需要注意的是: Java虚拟

C#中的线程(二)线程同步

Keywords:C# 线程Source:http://www.albahari.com/threading/Author: Joe AlbahariTranslator: Swanky WuPublished: http://www.cnblogs.com/txw1958/Download:http://www.albahari.info/threading/threading.pdf    第二部分:线程同步基础   同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具: 简易

java线程池当其中一个线程算出结果,终止全部线程

问题描述 java线程池当其中一个线程算出结果,终止全部线程 业务逻辑: 一个大型社区,每一秒有上千人在提交留言,提交的留言将经过,上万条的正则表达式的过滤,没有匹配任何规则的,才保存到系统,否则提示用户,您录入的内容不合法. 我是这样想的,把这上万条正则表达式,拆分成2000条一组,开一个5个线程的线程池,每个线程将负责其中2000个规则的匹配. 每条留言提交时,将由这5个线程,去判断是否有匹配的规则,如果其中一个线程匹配到了规则,将结束其他4个线程的任务,返回给用户结果. 请问这种要怎么实现