为了提高系统吞吐量和系统响应时间,线程池设置需要根据以下参数配置
tasks: 每秒的任务数,假设为1000
taskcost:每个任务花费时间,假设为0.1s
responsetime:系统允许容忍的最大响应时间,假设为1s
-
corePoolSize = 每秒需要多少个线程处理?
threadcount = tasks/(1/taskcost) = tasks * taskcost = 1000 * 0.1 = 100 个线程。corePoolSize设置应该大于50,根据80,20原则,如果80%的每秒任务数小于800,那么corePoolSize设置为80即可 -
queueCapacity = (corePoolSize/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采用默认通常能满足
以上都是理想值,实际情况下需要根据机器性能来决定,如果在未达到最大线程数的情况下机器的cpu load已经满了,则需要通过升级硬件和优化代码,降低taskcost来处理。
网友评论