文章目录
1. 线程池
<1> 线程的生命周期,创建和销毁都是有一些代价的,需要JVM辅助的,对内存消耗也很大,所以都是创建固定的量的线程,而不是多少个任务创建多少个线程,线程的复用很有必要
<2> 线程池的好处:
1- 加快了响应的速度2- 合理利用了CPU和内存
3- 统一管理
<3> 线程池应用的场合:服务器接收到大量请求时,使用线程池技术是非常合适的,他可以大大减少线程的创建和销毁的次数,提高服务器的工作效率
<4> 实际上,在开发中有超过五个线程的需求时,就可以使用线程池来管理
2. 添加线程的规则:
<1> 1- 如果线程数小于corePoolSize,创建一个新的线程来运行新任务
<2> 如果线程数等于(或大于)corePoolSize但是少于maxPoolSize,则将任务放入队列中
<3> 如果队列已满,并且线程数小于maxPoolsize。则创建一个新的线程
<4> 如果队列已满,并且线程数大于或者等于maxPoolSize,则拒绝
总结:是否需要增加线程的判断顺序时:corePoolSzie–>workQueue–>maxPoolSize
3.增减线程的特点
<1> 通过设置corePoolSize和maxPoolSize相同,就可以创建一个固定大小的线程池
<2> 线程池希望保持较少的线程数,并且只有在负载变得很大的时候才增加它
<3> 通过设置maxPoolSize为很高的值,可以允许线程池容纳任意数量的并发任务
<4>只有在队列填满的时候才会创建多余corePoolSize的线程数,如果使用的时无界队列,那么线程数用于都不会超过corePoolSize
4. 线程池里的线程数量设定为多少比较合适
<1> CPU密集型(加密,计算hash等):最佳线程数为CPU核心的1-2背
<2> 耗时IO型(读写数据库,文件,网络读写等):最佳线程数一般会大于CPU核心数很多倍
参考推荐的计算方法:线程数 = CPU核心数*(1+平均等待时间/平均工作时间)
5. 单体架构,集群,分布式,微服务的理解
<1> 单体架构:一台服务器上完成各个功能模块
<2> 集群:按单体架构复制出多个服务器(同一个业务部署在多个服务器上) #分散压力
<3> 分布式:将各个模块拆分为独立的服务器(一个业务拆分成多个子业务,部署在不同的服务器上) #分散能力
<4>分布式和微服务的区别,微服务是架构设计方式(逻辑上的架构),分布式是系统部署方式(实际物理上的架构),可以说要实现微服务这种逻辑架构目前都是用分布式来实现的
6. CAP理论是什么(三者不可兼得,最多兼得两种,P一般无法避免,一般都要存在,所以一般都是AP,CP)
<1> C(Consistency,一致性):读操作是否总能读到前一个写操作的结果
<2> A(Avaliablity,可用性):非故障节点应该在合理的时间内做出合理的响应
<3> P(partition tolerance,分区容错性):当出现网络分区现象后,系统能够继续运行
7. Docker的用途
<1> 提供统一环境
<2> 提供快速拓展,弹性伸缩的云服务
<3> 防止其他用户的进程把服务器资源占用过多
8. Nginx优点
<1> 高并发,高性能
<2> 可扩展性好
<3> 高可靠性
<4> 热部署
<5> 开源,可商用