zoukankan      html  css  js  c++  java
  • 线程池-五种类型作用以及线程池回收增长策略

    一、线程池的增长和回收策略
    增长策略:默认线程池接收到任务,创建一个线程去执行当前任务,当线程数大于核心线程数,会将任务添加到任务队列中,当队列满了,会创建新的线程去
    执行任务。当线程数大于最大线程数停止。并启动拒绝策略。
    回收策略:线程池中线程的数量大于核心线程数量&&有空闲线程&&空闲线程的空闲时间大于了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密集型




  • 相关阅读:
    cube.js 基于http 通道的数据实时更新bug 解决
    cube.js 基于http 通道的数据实时更新
    cube.js websocket 实时数据更新说明
    phpspy 进行php 项目性能分析
    使用groovy 下载maven依赖包
    java 几个不错的代码生成工具
    语言性能分析工具总结
    使用rbspy 分析ruby应该性能
    dremio v18.0 软件包可以使用了
    nginx rewrite查询字符串重写问题
  • 原文地址:https://www.cnblogs.com/lwdmaib/p/13806129.html
Copyright © 2011-2022 走看看