当前位置: 首页 > 科技观察

SpringBoot中线程池的设置

时间:2023-03-18 14:54:25 科技观察

前言多线程的设置是编程中很重要的一环。无论是工作编程还是面试,都是一个常见的话题。多线程比单线程快吗?答案肯定是否定的,什么时候用多线程合适,什么场景下用?如何更改线程池的配置?本文做一个总结,欢迎小伙伴们交流。1.一些概念介绍:1.1计算机基础知识:计算机的主要部件是CPU、内存和磁盘。比较运行速度的结果是:CPU>Memory>Disk。1.2上下文切换:说到上下文切换,单核cpu切换是没有意义的,多核cpu切换才能真正达到充分利用资源达到高性能的目的。1.3线程争用:当多个线程执行不同的任务但访问相同的资源时,可能会造成数据问题。1.4并发执行:可以理解为线程执行相同的任务,访问相同的资源时触发的场景。1.5自旋锁:一个很形象的比喻是:宝宝倒奶的时候还在哭,等妈妈送奶瓶换尿布,等妈妈把所有的事情都处理好才算结束,否则就是a等待状态。1.6互斥锁:类似于自旋锁,不同的是选举失败的线程会重新休眠,直到有锁可供竞争。不断循环等1.7乐观锁:乐观锁一个很常见的例子就是在数据库的数据操作中,直到更新提交后,相关的数据行才被锁定。1.8悲观锁:悲观锁是指如果一个事务操作使用了锁,只有当该事务释放锁(releasemother)时,其他事务才能执行与锁冲突的操作。1.9时间片分配算法:CPU通过为每个线程分配CPU时间来实现任务执行,这个时间片一般为几十毫秒。这样来回切换任务,运行程序,划分时间片称为:时间片分配算法。2.线程池配置介绍:由于线程池的设置必须跟随服务器硬件和业务处理,所以不同场景的配置是不一样的。场景假设:keyvalue配置value备注tasks(系统每秒任务数)每秒任务数,假设100~1000taskcost(执行任务花费的时间)每个任务花费的时间,假设0.1sresponsetime(允许响应时间))Maximumtime)系统允许的最大响应时间,假设为1s计算公式:设置键值计算公式,注意核心线程数设置(corePoolSize)threadcount=tasks/(1/taskcost)=tasks*taskcost=(200~1000)*0.1=20~100个线程。corePoolSize设置应该大于20。根据8020原则,如果每秒80%的任务小于200,那么corePoolSize可以设置为20。队列数量设置(queueCapacity)可以通过queueCapacity=20/0.1*1=200表示队列中的线程可以等待1s。如果超过了,就需要开一个新的线程去执行。切记不要设置为Integer.MAX_VALUE,这样队列会很大,线程数只会保持在corePoolSize大小。当任务剧增时,无法开启新的线程执行,响应时间会剧增。最大线程数设置(maxPoolSize)可以通过maxPoolSize=(1000-200)/10=80来计算(最大任务数-队列容量)/每个线程每秒3.总结:多线程的使用场景是多个任务的执行,但是CPU处理时间不长,占用的时间片不高,所以多线程会非常大的提高性能,相反,多线程没有单线程快。SpringBoot中线程池有3个比较重要的概念:核心线程数、队列数、最大线程数。当任务到来时,如果没有达到corePoolSize,就会创建一个新的线程执行任务,直到corePoolSize达到设定值,进入队列。当队列已满时,将创建新线程,直到设置了最大线程maxPoolSize。都满了设置的拒绝策略执行的时候。