线程池的数量和线程池中线程数量如何设置-理论篇
1.引言
大家可能都和我一样,在网上看到过这样的一个理论(先不说正确与否):
- 计算密集型:CPU核心数+1
- I/O密集型:CPU核心数*2
Linux查看命令:lscpu
按照上面的理论,那么我的线程池大小应该设计成这样:
- 计算密集型:CPU核心数+1=17
- I/O密集型:CPU核心数*2=32
但是有没有发现这样的一个问题,这里说的好像都是一个线程池中线程的数量,如果一个项目中存在多个线程池 ,是不是每一个线程池都应该设置成一样的线程数量。这里就会引出一下几个问题:
2. 项目中是不是只能有一个线程池?
对于 项目中是不是只能有一个线程池?
这个问题,很显然大家都知道不太可能只能拥有一个线程池。就拿一个简单的Web项目来说,至少会有一个Tomcat的处理线程池。如果项目需要连接数据库那么至少还会有一个数据库的链接管理线程池。这样来说就至少存在了两个线程池。结论就是:大部分项目中线程池会存在多个特别是在Web项目中,但是在某些非Web应用也可能只存在一个线程池或者不存在线程池的情况。
这种存在多个线程池的情况下显然就不适用了开篇提到的网上说的那个理论,因为web项目中tomcat的线程池默认值大小就是200,如果按照上面的理论显然是不正确的。那么如何设置线程池的大小(线程池中线程数量多少)首先要搞清楚以下几个问题:
-
单个线程池和线程池中线程是如何执行的是不是有不同
例如单独创建10个线程启动运行,和线程池创建线程数量10个的线程是不是一样获取CPU的执行
-
两个线程池线程数为5和一个线程池数量为10的是否一样