并发较高怎么设置多线程数量?
这个需要根据具体任务和机器性能来综合考虑,通过不断的性能测试,分析出最佳线程数量。
1.CPU密集型:cpu利用率较高,设置线程数量和cpu核心数一样即可。使cpu得到充分利用。2.IO密集型:IO密集型,主要进行长时间的IO操作,cpu利用率不如cpu密集型高,一般设置线程数为CPU两倍。如何来设置:a.需要几个数据来计算tasks:每秒的任务数,假设为500~1000taskCost:每个任务需要花费的时间,假设为0.1sresponseTime:系统允许的最大响应时间,假设为2sb.计算过程--corePoolSize=每秒需要的线程数?threadCount=tasks/(1/taskCost)=tasks*taskCost=(500~1000)*0.1=50~100个线程。corePoolSize的个数应该大于等于50。根据8020原则,如果每秒80%的时间执行200个任务,那么corePoolSize设置为80即可。--queueCapacity=(coreSizePool/taskCost)*responseTime计算可得queueCapacity=(80/0.1)*2。意思是队列里的线程可以等待2秒,超过了就需要开新的线程来执行,千万不能设置为Integer.MAX_VALUE,这样队列会很大,线程数只会保持在corePoolSize大小,当任务陡增时,不会开新的线程来执行,响应时间也会陡增。--maxPoolSize=(max(tasks)-queueCapacity)/(1/taskCost)计算可能maxPoolSize=(1000-80)/10=92,(最大任务数-队列容量)/每个线程每秒处理的任务数=最大线程数--rejectedExecutionHandler:根据具体情况来决定,任务不重要可以丢弃,也可采用排队等策略--keepAliveTim和allowCoreThreadTimeout通常采用默认值就可以c.上面的计算都是理想的情况,在实际生产中,还要根据机器的性能,升级机器硬件来处理高并发产生的任务数Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有