余杭网站建设,淘宝详情页设计,网站建设网页怎么排列顺序,wordpress会员管理为什么会有线程池#xff1f;
如果客户端发一个请求#xff0c;服务端就创建一个线程接收请求#xff0c;线程资源是有限的#xff0c;而且创建一个线程和执行结束之后都要调用操作系统资源销毁线程#xff0c;这样频繁操作肯定非常占用cpu和内存资源#xff0c;线程池的…为什么会有线程池
如果客户端发一个请求服务端就创建一个线程接收请求线程资源是有限的而且创建一个线程和执行结束之后都要调用操作系统资源销毁线程这样频繁操作肯定非常占用cpu和内存资源线程池的作用就是实现线程的资源复用和控制最大线程数还有队列异步处理请求这样就减少线程资源的浪费
一、ThreadPoolExecutor参数如何设置
核心线程数corePoolSize、最大线程数maximumPoolSize
可以根据三个方面进行分析
CPU密集型任务要避免线程的上下文切换所以尽量要少创建线程把corePoolSize设置成CPU核心数1加1是为了避免当中有的线程因为特殊情况被挂起为了尽可能的利用CPU资源IO密集型任务当线程操作IO资源时CPU资源是闲置的我们可以尽可能创建合适的线程数来压榨CPU资源IO时间越长可以设置更多的线程数但是不一定越多越好我们可以通过这个公式来计算线程数CPU核心数*(1线程等待时间/线程运行总时间)混合型任务 总时间-总时间CPU线程等待时间
理想状态下可这样估算但是系统可能运行有其它线程所以要进行压测
jmeter压测
pom.xml文件配置
parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.5.0/versionrelativePath/ !-- lookup parent from repository --/parent
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency/dependencies
java代码
SpringBootApplication
public class Application {public static void main(String[] args){SpringApplication.run(Application.class, args);}
}RestController
public class TestController {GetMapping(/test)public String test() throws InterruptedException {Thread.sleep(1000);return test;}
} jmeter压测操作 添加聚合报告 添加结果树视图 聚合结果报告 默认最大200个连接总执行时间25s平均响应时间(Average)4.2s最小响应时间(Min)1s最大响应时间(Max)8s请求错误率(Error)0%吞吐量(Throughput)每秒钟完成125.5个请求 设置最大800个连接总执行时间9s平均响应时间(Average)1.2s最小响应时间(Min)1s最大响应时间(Max)2.5s请求错误率(Error)0%吞吐量(Throughput)每秒钟完成560.6个请求 基本上压测最大连接数值如果平均响应时间和执行总时间趋于稳定为准 总结
CPU密集型任务CPU核心数1IO密集型任务抽样系统高峰期CPU执行时间再先通过公式算出理论值然后通过理论值进行压测压测的业务如果是核心业务并发量高比如1s需要处理1000个请求corePoolSize和maximumPoolSize都可以设置成500如果是非核心业务并发量小核心线程数保留10个就行最大线程数设置1000队列大小需要根据线程1s能处理多少请求比如1s能处理100个请求队列中有300个任务也就是说任务可能要等3s才能处理完如果不能接受这个时间就要限制队列大小
二、ThreadPoolExecutor具体执行过程
1、JUC包下ThreadPoolExecutor执行流程 核心线程来一个任务创建一个线程提交任务数超过核心线程数会放到队列中队列中放不下会在小于maximumPoolSize前提又创建新任务核心线程和非核心线程任务都做完了都会到队列中去拿任务
2、tomcat的ThreadPoolExecutor执行流程
创建ThreadPoolExecutor对象时就已经初始化好了核心线程 三、ThreadPoolExecutor如何关闭
正常关闭、异常关闭、手动调用shutdown()、shutdownNow()方法
https://www.processon.com/view/link/64cb797372e1a4480965cf86
为什么线程池执行任务时抛出异常会重新创建一个线程
方便做线程异常处理如果直接忽略导致无法处理异常所以让它抛出异常终止然后重启一个线程
ThreadPoolExecutor executor new ThreadPoolExecutor(10, 100, 1000, TimeUnit.MILLISECONDS, new ArrayBlockingQueueRunnable(100), new ThreadFactory() {Overridepublic Thread newThread(Runnable r) {Thread thread new Thread(r);thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {Overridepublic void uncaughtException(Thread t, Throwable e) {System.out.println(拦截异常);}});return thread;}});