最近学java线程池,需要设置核心线程数和最大线程数,网上有人说按照CPU的核数来设置,有人说按照任务的执行时间的一个相关公式来设置,究竟怎么设置有人知道吗??
http://ifeve.com/how-to-calculate-threadpool-size/
这个问题就我所知没有通用的公式,如果你要执行的任务是耗时很长但不需要多少cpu资源的,那么线程数可以多些,如果是计算密集型任务,将核心线程数设置和cpu逻辑核心数量一致或稍大于就可以,具体大于多少要取决于你的程序哭啼实现。低于cpu逻辑核心数量会浪费资源,高于会多个任务抢占cpu资源,线程的切换也是有开销的,会起反效果
- corePoolSize = 每秒需要多少个线程处理? * threadcount = tasks/(1/taskcost) =tasks*taskcout = (500~1000)*0.1 = 50~100 个线程。corePoolSize设置应该大于50 * 根据8020原则,如果80%的每秒任务数小于800,那么corePoolSize设置为80即可
- queueCapacity = (coreSizePool/taskcost)*responsetime * 计算可得 queueCapacity = 80/0.1*1 = 80。意思是队列里的线程可以等待1s,超过了的需要新开线程来执行 * 切记不能设置为Integer.MAX_VALUE,这样队列会很大,线程数只会保持在corePoolSize大小,当任务陡增时,不能新开线程来执行,响应时间会随之陡增。
- maxPoolSize = (max(tasks)- queueCapacity)/(1/taskcost) * 计算可得 maxPoolSize = (1000-80)/10 = 92 * (最大任务数-队列容量)/每个线程每秒处理能力 = 最大线程数 - rejectedExecutionHandler:根据具体情况来决定,任务不重要可丢弃,任务重要则要利用一些缓冲机制来处理
- keepAliveTime和allowCoreThreadTimeout采用默认通常能满足 作者: 如饥似渴的学习IN 链接:http://www.imooc.com/article/5887 来源:慕课网