线程池
为什么要使用线程池?
1.反复创建线程开销大
2.过多的线程会占用太多的内存
线程池的重要性:
1.用少量的线程——避免内存占用过多
2.让这部分线程都保持工作,且可以反复执行任务——避免生命周期的损耗
3.加快响应速度
4.合理利用CPU和内存
5.统一管理
线程池适合应用的场景:
服务器接受到大量请求时,使用线程池技术非常的合适,它可以大大减少线程的创建和销毁次数,提高服务器的工作效率
实际上,在开发中,如果需要创建5个以上的线程,那么就可以使用线程池来管理
线程增减的时机

- corePoolSize核心线程数
线程池在完成初始化后,默认情况下,线程池中并没有任何线程,线程池会等待有任务到来时,再去创建新线程去执行任务 - maxPoolSize对大线程数
在核心线程的基础上,额外增加的线程数的上限 - keppAliveTime存活时间
如果线程池当前的线程数多于corePoolSize,那么如果多余的线程空闲时间超过keepAliveTime,它们就被终止 - ThreadFactory 创建线程
默认使用Executors.defaultThreadFactory()
创建出来的线程都在同一个线程组里
如果自己指定ThreadFactory ,那么就可以改变线程名、线程组、优先级、是否守护线程等 - workQueue工作队列
直接交接:SynchronousQueue没有队列
无界队列:LinkedBlockingQueue无限队列
有界队列:ArryBlockingQueue设置队列大小
添加线程的规则

1.如果线程小于corePoolSize,创建一个新线程来运行新任务
2.如果线程数等于或大于corePoolSize但小于maxPoolSize,则将任务放入队列
3.如果workQueue队列已满,并且线程数小于maxPoolSize,则创建一个新线程
4.如果workQueue队列已满,并且线程数大于或等于maxPoolSize,则拒绝

增减线程的特点
- 通过设置corePoolSize和maxPoolSize相同,就可以创建固定大小的线程池。
- 线程池希望保持较少的线程数,并且只有在负载变得很大时才增加它
- 通过设置maxPoolSize为很高的值,可以允许线程容纳任意数量的并发任务
- 只有在队列填满时才创建多于corePoolSize的线程,如果使用的是无界(无限)队列,那么线程数就不会超过corePoolSize
线程池应该手动创建还是自动创建
手动创建更好,因为可以更加明确线程池的运行规则,避免资源耗尽的风险。1.newFixedThreadPool(固定数量)自动创建容易造成大量内存占用,可能会导致OOM。
2.newSingleThreadExecutor当请求堆积的时候,可能会占用大量内存
3.newCachedThreadPool(可缓存)弊端在于maximunPoolSize设置为了Integer.MAX_VALUE,这可能会创建非常多的线程,导致OOM。
4.newScheduledThreadPool(周期执行)

线程池里的线程数量设定为多少比较合适?
- CPU密集型(加密、计算hash等):最佳线程数为CPU核心数的1-2倍左右。
- 耗时IO型(读写数据库、文件、网络读写等):最佳线程数一般会大于CPU核心数很多倍
- 参考Brain Goetz计算方法:线程数=CPU核心数*(1+平均等待时间/平均工作时间)
线程池还未学完!!!!!!!
分布式
什么是分布式?
利用物理架构形成多个自治的处理元素,不共享主内存,但是通过发送信息合作——Leslie Lamport



CAP定理
CAP是什么?
C一致性:读操作是否总能读到前一个写操作的结果
A可用性:非故障节点应该在合理的时间内做出合理的响应
P分区容错:当出现网络分区现象后,系统能够继续运行(必须有)
CAP怎么选?
- 因为P必须有,所以只能选CP或AP
- 在什么场合,可用性高于一致性?
- 一般关于钱财的选CP,官网选AP
集群、分布式、微服务的区别
- 分布式:一个业务拆分多个子业务,部署在不同的服务器上。分布式是系统部署方式(物理)
- 集群:同一个业务,部署在多个服务器上,分散压力
- 微服务:分散能力,微服务是架构设计方式(逻辑)
网络编程

每个线程一个连接,一个连接大概占用1兆。
10万+

被折叠的 条评论
为什么被折叠?



