近期看了一些JVM和并发编程的专栏,结合自身理解,来作一个关于(线程池线程数与(CPU密集型任务和I/O密集型任务)的关系)的总结:css
1.任务类型举例:算法
1.1: CPU密集型:编程
例如,通常咱们系统的静态资源,好比js,css等,会存在一个版本号,如 main.js?v0,每当用户访问这个资源的时候,会发送一个比对请求到服务端,比对本地静态文件版本和服务端的文件版本是否一致,不一致则更新.这种任务通常不占用大量IO,因此后台服务器能够快速处理,压力落在CPU上.服务器
1.2: I/O密集型:并发
比方说近期咱们作的万科CRM系统,常有大数据量的查询和批量插入操做,此时的压力主要在I/O上.大数据
2.线程数与任务类型的关系:线程
2.1:与CPU密集型的关系:生命周期
通常状况下,CPU核心数 == 最大同时执行线程数.在这种状况下(设CPU核心数为n),大量客户端会发送请求到服务器,可是服务器最多只能同时执行n个线程.队列
设线程池工做队列长度为m,且m>>n,则此时会致使CPU频繁切换线程来执行(若是CPU使用的是FCFS,则不会频繁切换,如使用的是其余CPU调度算法,如时间片轮转法,最短期优先,则可能会致使频繁的线程切换).资源
因此这种状况下,无需设置过大的线程池工做队列,(工做队列长度 = CPU核心数 || CPU核心数+1) 便可.
2.2:与I/O密集型的关系:
1个线程对应1个方法栈,线程的生命周期与方法栈相同.
好比某个线程的方法栈对应的入站顺序为:controller()->service()->DAO(),因为DAO长时间的I/O操做,致使该线程一直处于工做队列,但它又不占用CPU,则此时有1个CPU是处于空闲状态的.
因此,这种状况下,应该加大线程池工做队列的长度(若是CPU调度算法使用的是FCFS,则没法切换),尽可能不让CPU空闲下来,提升CPU利用率.
若理解有误,请指正.