线程池-五种类型作用以及线程池回收增长策略

一、线程池的增长和回收策略
增长策略:默认线程池接收到任务,创建一个线程去执行当前任务,当线程数大于核心线程数,会将任务添加到任务队列中,当队列满了,会创建新的线程去
执行任务。当线程数大于最大线程数停止。并启动拒绝策略。
回收策略:线程池中线程的数量大于核心线程数量&&有空闲线程&&空闲线程的空闲时间大于了KeepAliveTime时,会对空闲线程进行回收,直到等于核心线程
为止。

keepAliveTime:核心线程数之外线程,最大空闲时间
ThreadFactory: 用来创建线程池中的线程

二、无界队列的使用
new ThreadPoolExecutor(30,60,60L,TimeUnit.MILLISECONDS,new LinkedBlockQuque());
这个线程吃问题是什么?new LinkedBlockQuque() 无参构造
public LinkedBlockQuque(){
this(Integer.MAX_VALUE);
}
相当于无界队列,那么这个时候出现的问题,当线程数大于核心线程数时候,新的任务会添加到任务队列中,由于这个是无界队列,
那么永远无法达到线程数大于最大线程数,从而无法触发拒绝策略。
    如果我们需要使用无届队列怎么办?将最大线程数设置为与核心线程数一样。这样保证线程池里面的线程可以充分利用

三、线程池的方式
1、newFixedThreadPool 创建固定数量的线程池,也就是说当前线程池里面有固定数量的线程池,无届队列存储。
如果线程都在使用中,当进入新的线程任务,任务将添加到无届队列中。当线程显示的关闭了。才会被回收。

2、newSingleThreadPool 只有一个线程在运行的线程池,可以保证线程任务顺序执行。

3、newCacheThreadPool 线程池中没有固定数量,如果需要可以随时创建,其他线程如果可重用了,还会被使用,
还会被回收(默认回收时间是1分钟)没有可重用的,就会创建新的线程
    4、newScheduleThreadPool 线程池中有指定数量的线程,线程中空闲线程不会被回收。线程任务可以定时执行或者延迟执行

5、newSingleScheduleThreadPool 线程池中只有一个线程在执行,之后提交的任务将放入到队列中,可以定时或者延迟执行线程

四、如何设置线程池数
1、根据任务类型,判断当前任务如果当前任务使用cpu多的话比如计算类。这时候设置采用n+1(其中n代表cpu的核心数)。1代表了如果出现某一任务
暂停,cpu出现了空闲1可以马上调用使用。也叫cpu密集行
2、如果任务类型,当前任务去网络读取,或者读取文件等多io操作的,这时候采用2n(n代表cpu的核心数) 也叫io密集型




posted @ 2020-10-12 22:50  liuwd  阅读(805)  评论(0编辑  收藏  举报