线程池
为什么要使用线程池?
反复创建线程开销大、过多的线程会占用太多内存
线程池的好处:加快响应速度、合理利用CPU和内存、统一管理
线程池中构造方法的参数
corePoolSize指的是核心线程数
线程池在完成初始化后,默认情况下,线程池中并没有任何线程,线程池会等待有任务到来时,再创建新线程去执行任务
maxPoolSize最大量
在核心线程数的基础上,额外增加的线程数的上限
keepAliveTime
如果线程池当前的线程数多于corePoolSize,那么如果多余的线程空闲时间超过keepAliveTime,它们就会被终止
workQueue工作队列:
3种最常见的队列类型:
直接交换:SynchronousQueue
无界队列:LinkedBlockingQueue
有界的队列:ArrayBlockingQueue
ThreadFactory用来创建线程
默认使用Executors.defaultThreadFactory()
创建出来的线程都在同一个线程组
添加线程规则:
如果线程数小于corePoolSize,则创建一个新线程来运行新任务
如果线程数等于或大于corePoolSize但少于maxinumPoolSize,则将任务放入队列
如果队列已满,并且线程数小于maxPoolSize,则创建一个新线程
如果队列已满,并且线程数大于或等于maxPoolSize,则拒绝
是否需要增加线程的判断顺序是:corePoolSize、workQueue、maxPoolSize
增减线程的特点:
通过设置corePoolSize和maxinumPoolSize相同,就可以创建固定大小的线程池
线程池希望保持较少的线程数,并且只有在负载变得很大时才增加它
通过设置maxinumPoolSize为很高得值,可以允许线程池容纳任意数量得并发任务
只有在队列填满时才会创建多于corePoolSize的线程,如果使用的是无界队列,那么线程数就不会超过corePoolSize。
线程池应该手动创建还是自动创建?
手动创建更好,可以更加明确线程池的运行规则,避免资源耗尽的风险
自动创建线程池(直接调用jdk封装好的构造方法)可能带来的问题?
newFixedThreadPool 容易造成大量内存占用。可能会导致OOM
newSingleThreadExecutor 当请求堆积的时候,可能会占用大量的内存
标签:corePoolSize,创建,队列,线程,内存,maxPoolSize
来源: https://www.cnblogs.com/LinAlex/p/15385592.html