9) 2021-11-22 学习记录,以面试回答口吻记录,拒绝八股 在架构的角度思考线程池

1 问题:如何线程在使用中的问题:
new Thread().start();
1.线程的频繁创建容易去销毁
2.线程的数量过多容易造成CPU资源的浪费,上下文切换,消耗CPU资源
思考:如何实现线程的复用
2 池化技术:
连接池技术,例如数据库的,c3p0和dbcp还有阿里的durid,boot底层默认的hakari
对象池,常量池,内存池,线程池
池化技术的核心就是复用,管理
3 线程池
提前创建好线程,保存在这个线程池中,在有任务的时候,从线程池中拿出来执行,
没有任务的时候,线程池放回去
Java里面提供了以下线程池
必须有的四个参数 corePoolSize,maxPoolSize,keepAliveTime,TimeUnit unit,
BlockingQueue workingQueue 阻塞队列。
ThreadFactory theadFactory, 线程工厂(自定义线程的名字),RejectedExecutionHadler handler 拒绝策略 这两个默认实现。
① newSingleThreadPool 只有一个线程的线程池
② newFixedThreadPool 固定线程数量的线程池
③ newCachedThreadPool 可缓存的线程池,理论上说有多少请求,该线程池就可以创建多少线程来处理,
④ newScheduledThreadPool 周期执行任务的线程池
4 通过阻塞队列的方式实现线程的复用,即思想为如果有任务来的时候执行,无任务就阻塞线程
5 过程
①先初始化核心线程
②调用阻塞队列的方法,把任务task存进去(offer -> true/fasle)
1)如果为true,表示请求量不大,当前核心线程可以搞定
2)如果false,增加线程, 若失败就代表当前工作的线程数量达到了最大线程数, 直接调用拒绝策略
addWorker worker.run()
6.线程数量的设置
IO密集型 CPU 2core+1 CPU利用率不高
CPU密集型 CPU + 1 CPU利用率高会增加上下文切换

猜你喜欢

转载自blog.csdn.net/qq_45095838/article/details/121483351
今日推荐