Java线程池的7个参数详解

目录

前言

流程图-线程池参数是如何工作的

threadFactory

corePoolSize

workQueue

maximumPoolSize

handler

keepAliveTime和unit


前言

Java线程池和它的七个小参数

流程图-线程池参数是如何工作的

threadFactory

创建线程用的线程工厂。

不设置这个参数会使用默认的线程工厂。

可以通过实现ThreadFactory接口的方式,自定义线程工厂。自定义的线程工厂,可以根据需要为每个线程设置不同的线程名,例如在线程名里带入机房编号、线程用途等。

corePoolSize

核心线程数。

线程池刚初始化时,线程数量为0。

当有新的任务提交到线程池且没有空闲线程,如果当前线程数量小于corePoolSize,那么会创建新的线程来执行这个新任务。

workQueue

工作队列。

当有新的任务提交到线程池且没有空闲线程,如果当前线程数量达到了corePoolSize,那么会将任务暂存在工作队列里。

Java提供了四种工作队列:

  1. ArrayBlockingQueue:有界阻塞队列,先进先出,底层是数组。
  2. LinkedBlockingQuene:无界阻塞队列(实际上最大容量为Interger.MAX),先进先出,底层是链表
  3. SynchronousQuene:大小为0的阻塞队列。
  4. PriorityBlockingQueue:无界阻塞队列(实际上最大容量为Interger.MAX),按优先级取任务,底层是平衡二叉树

maximumPoolSize

最大线程数。

当有新的任务提交到线程池且没有空闲线程,如果工作队列已经满了,且当前线程数量小于maximumPoolSize,那么会创建新的线程来执行这个新任务。

注意这里新提交进来的任务,会先于之前提交到工作队列中的任务执行,极端情况下,空闲线程会一直被新提交进来的任务抢占,导致工作队列里的任务一直没有机会被执行。

handler

拒绝策略。

当有新的任务提交到线程池且没有空闲线程,如果工作队列已经满了,且当前线程数量达到了maximumPoolSize,那么会执行拒绝策略。

Java提供了四种拒接策略

  1. AbortPolicy:丢弃任务,并抛出RejectedExecutionException异常。AbortPolicy是线程池默认拒绝策略。
  2. CallerRunsPolicy:在调用线程池的线程中执行任务。
  3. DiscardPolicy:只丢弃任务,不做其他事情。
  4. DiscardOldestPolicy:丢弃工作队列里的第一个任务,然后尝试将新任务加入工作队列

keepAliveTime和unit

keepAliveTime是线程允许的最大空闲时间,unit是keepAliveTime的单位,TimeUnit类里定义了unit相关常量。

当线程数量大于corePoolSize时,如果有线程的空闲时间超过keepAliveTime,那么会回收这个空闲线程。

如果设置了allowCoreThreadTimeOut,那么即使线程数量小于corePoolSize,有线程空闲时间超过keepAliveTime也会被回收。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java线程池是一种用于管理和复用线程的机制,它可以提高多线程程序的性能和效率。在Java中,线程池由ThreadPoolExecutor类实现,通过设置不同的参数可以对线程池的行为进行调整。 以下是Java线程池的一些常用参数及其解释: 1. corePoolSize(核心线程数):线程池中始终保持的活动线程数,即使它们处于空闲状态。当有新任务提交时,如果活动线程数小于corePoolSize,则会创建新线程来处理任务。 2. maximumPoolSize(最大线程数):线程池中允许存在的最大线程数。当活动线程数达到maximumPoolSize并且工作队列已满时,新任务将会被拒绝。 3. keepAliveTime(线程空闲时间):当线程池中的线程数量超过corePoolSize时,多余的空闲线程在等待新任务到来时的最长等待时间。超过这个时间,空闲线程将被终止。 4. unit(时间单位):keepAliveTime的时间单位,可以是秒、毫秒、微秒等。 5. workQueue(工作队列):用于存储等待执行的任务的阻塞队列。常见的工作队列有ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue等。 6. threadFactory(线程工厂):用于创建新线程工厂类。可以自定义线程的名称、优先级等属性。 7. handler(拒绝策略):当线程池无法接受新任务时的处理策略。常见的拒绝策略有AbortPolicy(默认,抛出RejectedExecutionException异常)、CallerRunsPolicy(由调用线程执行任务)、DiscardPolicy(直接丢弃任务)和DiscardOldestPolicy(丢弃最旧的任务)。 这些参数可以根据实际需求进行调整,以达到最佳的线程池性能和资源利用率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值