线程池的核心参数

  • corePoolSize:(缓存线程池中可以为0),可以通过setCorePoolSize设置。核心线程数,线程池的基本大小,当提交一个任务到线程池时,线程池会创建一个线程来执行任务,即使其他空闲的线程能够执行新任务也会创建线程,等到需要执行的任务数大于线程池基本大小的时候就不再创建了。如果调用了线程池的prestartAllCoreThreads()方法,线程池会提前创建并启动所有基本线程
    任务队列未达到队列容量时,最大可以同时运行的线程数量。
    线程池至少会保持该数量的线程存在,即使没有任务可以处理。
    线程池的基本大小,即使没有任务可以处理,线程池也会至少保留该大小的线程数量,也就是我们常说的核心线程数。
  • maximumPoolSize:线程池中允许的最大线程数。
    注意还有一个largestPoolSize,记录了曾经出现的最大线程个数。因为setMaximumPoolSize()可以改变最大线程数。
    任务队列中存放的任务达到队列容量的时候,当前可以同时运行的线程数量变为最大线程数。
    即使队列中的任务满了线程数量也不会超过maximumPoolSize
  • workQueue:新任务来的时候会先判断当前运行(正在执行任务的线程)的线程数量是否达到核心线程数,如果达到的话,新任务就会被存放在队列中。
    任务队列,达到核心线程数后,新来的任务会被放在该队列中。
    ArrayBlockingQueue:基于数组的有界阻塞队列,按FIFO(先进先出)原则对元素进行排序。新任务进来后,会放到该队列的队尾,有界的数组可以防止资源耗尽问题。当线程池中线程数量达到corePoolSize后,再有新任务进来,则会将任务放入该队列的队尾,等待被调度。如果队列已经是满的,则创建一个新线程,如果线程数量已经达到maxPoolSize,则会执行拒绝策略。
    LinkedBlockingQuene:基于链表的无界阻塞队列其实最大容量为Interger.MAX),吞吐量高于ABQ,由于该队列的近似无界性,当线程池中线程数量达到corePoolSize后,再有新任务进来,会一直存入该队列,而不会去创建新线程直到maxPoolSize,因此使用该工作队列时,参数maxPoolSize其实是不起作用的。
    SynchronousQuene:一个不缓存任务的阻塞队列。每个插入操作必须等到另一个线程调用移除操作才可插入,否则插入一直阻塞。吞吐量高于LBQ。说新任务进来时,不会缓存,而是直接被调度执行该任务(不会将该任务暂时寄存在队列中等待),如果没有可用线程,则创建新线程,如果线程数量达到maxPoolSize,则执行拒绝策略。
    PriorityBlockingQueue:一个具有优先级的无限阻塞队列。优先级通过参数Comparator实现。
  • keepAliveTime如果一个线程处在空闲状态的时间超过了该属性值,就会因为超时而退出。是否允许超时退出则取决于下面的逻辑。
    线程池维护线程所允许的空闲时间。当线程池中的线程数量大于 corePoolSize时,超过corePoolSize的线程不会立刻销毁,而是会等待,如果等待时间超过keepAliveTime,线程将被终止
    超过核心线程数且任务队列满时创建的的线程的存活时间
  • unit:线程池维护线程所允许的空闲时间的单位,和keepAliveTime配合使用。即keepAliveTime的单位。可以有天、小时、分钟、秒、毫秒等
  • ThreadFactory:用于设置新创建线程的工厂,创建新线程的时候会用到,例如设置线程名字、是否是守护线程等。
  • Handler:拒绝(饱和)策略。当队列和线程池都满了会触发。
    AbortPolicy:直接抛出异常。默认
    CallerRunsPolicy:在调用者所在线程来执行任务(处理)
    DiscardPldestPolicy:丢弃队列里最靠前最近的任务,并执行当前任务。
    DiscardPolicy:不处理,直接丢弃。
  • poolSize:当前线程池中线程的数量
  • allowCoreThreadTimeOut:是否允许核心线程超时退出。
    如果该值为false,且poolSize<=corePoolSize,线程池都会保证这些核心线程处于存活状态,不会超时退出。
    如果为true,则不论poolSize的大小,都允许超时退出。
    如果poolSize>corePoolSize,则该参数不论true还是false,都允许超时退出。
  • 当新提交一个任务时:
    如果poolSize<corePoolSize,新增加一个线程处理新的任务。
    如果poolSize=corePoolSize,新任务会被放入阻塞队列等待。
    如果阻塞队列的容量达到上限,且这时poolSize<maximumPoolSize,新增线程来处理任务。
    如果阻塞队列满了,且poolSize=maximumPoolSize,那么线程池已经达到极限,会根据饱和策略RejectedExecutionHandler拒绝新的任务。
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值