程序员的公众号:源1024,获取更多资料,无加密无套路!
最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》,《Java并发编程实战》等等
获取方式: 关注公众号并回复 电子书 领取,更多内容持续奉上
线程池的核心线程数(corePoolSize),当 allowCoreThreadTimeOut 为 false 时, 核心线程会一直存活, 哪怕是一直空闲着 。而当 allowCoreThreadTimeOut 为 true时核心线程空闲时间超过 keepAliveTime 时会被回收。
核心线程数大小,需要分析线程池执行的任务的特性:CPU 密集型还是 IO 密集型
CPU密集型任务
主要是执行计算任务, 响应时间很快, cpu 一直在运行, 这 种任务 CPU 的利用率很高, 那么线程数的配置应该根据 CPU 核心数来决定,?尽量使用较小的线程池,一般为CPU核心数+1。因为CPU密集型任务使得CPU使用率很高,若开过多的线程数,会造成CPU过度切换。
IO密集型任务
像 MySQL 数据库、文件的读写等任务,主要是进行 IO 操作, 执行 IO 操作的时间较长, CPU处于空闲状态, 导致?CPU的利用率不高, 这种情况下可以增加线程池的大小,结合线程的等待时长来判断, 等待时间越长, 那么线程数也相对越多 。一般可以设置为?2*CPU核心数?。可以让CPU在等待IO的时候有其他线程去处理别的任务,充分利用CPU时间。
总结
线程的平均工作时间所占比例越高,就需要越少的线程。
线程的平均等待时间所占比例越高,就需要越多的线程。
?