线程池参数配置

一、前言

线程池是一种用于管理和复用线程的机制,它可以有效地控制并发线程的数量,并提供了一种线程复用的机制,减少了线程创建和销毁的开销。实际项目中,常会使用到线程池,要使用线程池,配置好参数十分关键,掌握配置参数对如何用好线程池起了至关重要的作用。


二、线程池常用参数 ThreadPoolExecutor

在这里插入图片描述

1.corePoolSize:核心线程数

线程池中一直保持存活的线程数量,即使它们处于空闲状态。
如果线程池中的线程数小于核心线程数,新的任务将创建新线程来处理,即使有核心线程处于空闲状态。
这是为了更快地响应新任务而采取的策略,确保核心线程一直保持存活状态。

在配置corePoolSize之前,需要先了解什么是CPU密集型任务和I/O密集型任务

CPU密集型任务:需要大量使用CPU计算资源的任务。这些任务通常需要进行复杂的数值计算、图像处理、模拟仿真等操作,对CPU的计算能力有很高的要求。相对于I/O密集型任务,CPU密集型任务更加依赖CPU的处理能力,而不是I/O速度。

I/O密集型任务:需要大量使用I/O(输入/输出)操作的任务。这些任务通常需要频繁地读写磁盘、网络或其他外部设备,如文件处理,数据库操作,网络传输等,这些操作对I/O速度有很高的要求。相对于CPU密集型任务,I/O密集型任务更加依赖I/O速度,而不是CPU计算能力。

参数配置

  • CPU密集型:corePoolSize = CPU核数 + 1
  • IO密集型:corePoolSize = CPU核数 * 2

2.maximumPoolSize:最大线程数

线程池所允许的最大线程个数

当maxPoolSize>当线程数>=corePoolSize,且任务队列已满时。线程池会创建新线程来处理任务。

当线程数=maxPoolSize,且任务队列已满时,线程池会根据handle策略处理,默认是AbortPolicy 丢弃任务,抛运行时异常。

maxPoolSize往往设置成corePoolSize一样,这样可以减少在处理过程中创建线程的开销。


3.keepAliveTime:线程存活时间

当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=corePoolSize

如果allowCoreThreadTimeout=true,则会直到线程数量=0


4.workQueue工作队列

一般选择建议选择有界队列,因为如果任务特别多,核心线程处理不过来,会将任务都放到工作队列中,此时最大线程数已经没有意义了。如果控制不好会导致OOM。

LikendBlockingQueue需要维护一个个Node对象,需要额外的内存消耗。并且在生产和消费的时候,需要创建Node对象进行插入或移除,大批量数据的系统中,其对于GC的压力会比较大。

ArrayBlockingQueue只是维护final Object[] items;一个数组。在生产和消费的时候,是按照索引对数据插入或移除的,不会产生或销毁任何额外的对象实例。

综合来说,可以选择ArrayBlockingQueue


5.queueCapacity:队列容量

当核心线程数达到最大时,新任务会放在队列中排队等待执行。
taskcost:任务耗时
responsetime:相应时间

queueCapacity = (coreSizePool/taskcost)*responsetime


6.rejectedExecutionHandler:拒绝策略

两种情况会拒绝处理任务:

当线程数已经达到maxPoolSize,且队列已满,会拒绝新任务。

当线程池被调用shutdown()后,会等待线程池里的任务执行完毕再shutdown。如果在调用shutdown()和线程池真正shutdown之间提交任务,会拒绝新任务。线程池会调用rejectedExecutionHandler来处理这个任务。如果没有设置默认是AbortPolicy,会抛出异常。

JDK提供了四种拒绝策略:

AbortPolicy:直接丢弃新任务,抛出异常
DiscardPolicy:直接丢弃掉,不会抛出异常
DiscardOldestPolicy:丢弃时间最久的任务。一般是队列最前面的任务
CallerRunsPolicy:交给主线程去执行


三、ThreadPoolExecutor执行过程

在这里插入图片描述

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 线程池参数的合理配置取决于应用程序的负载和可用的计算资源。以下是一些常用的线程池参数配置建议: 1. 核心线程数:根据应用程序的负载和可用的计算资源,设置合适的核心线程数。通常情况下,核心线程数应该等于可用处理器的数量或稍微大一些。 2. 最大线程数:根据应用程序的负载和可用的计算资源,设置合适的最大线程数。最大线程数的设置应该根据应用程序的可用内存和CPU使用率进行调整。 3. 空闲线程存活时间:根据应用程序的负载和可用的计算资源,设置合适的空闲线程存活时间。如果任务数量不够多,可以适当降低空闲线程的存活时间,以减少资源占用。 4. 等待队列:根据应用程序的负载和可用的计算资源,选择合适的等待队列实现。如果任务数量比较大,可以选择使用 ArrayBlockingQueue 或者 LinkedBlockingQueue,如果任务数量比较小,可以选择使用 SynchronousQueue。 5. 线程工厂:根据需要自定义线程工厂,设置线程的名称、优先级等属性,以便于监控线程池的执行情况。 总之,线程池参数的合理配置需要根据具体的应用程序需求进行调整。在配置时,需要考虑应用程序的负载、可用的计算资源和线程池的性能等因素,以达到最优的线程池性能。 ### 回答2: 线程池参数配置需要根据实际场景和需求进行合理的选择。以下是一些常见的线程池参数配置建议: 1. 核心线程数(corePoolSize)的配置应根据系统的负载情况和并发任务的数量来确定。如果系统负载较重或并发任务较多,可以适当调高核心线程数,以确保有足够的线程处理任务,避免任务等待;如果负载较轻或并发任务较少,可以适当降低核心线程数,减少资源占用。 2. 最大线程数(maximumPoolSize)的配置应根据系统的资源情况和并发任务的特点来确定。最大线程数一般要大于核心线程数,以应对突发的任务请求。但过高的最大线程数可能导致资源占用过多,导致系统性能下降或者出现资源竞争问题。 3. 任务队列(workQueue)的选择需要根据任务的特点和对任务响应时间的要求来确定。如果任务量较小或者希望快速响应任务,可以选择使用SynchronousQueue,它会直接将任务交给线程处理,不会进行任务排队;如果任务量较大或者希望控制任务的处理速度,可以选择使用有界队列(如ArrayBlockingQueue或LinkedBlockingQueue),可以避免任务直接交给线程处理,使系统更稳定。 4. 空闲线程的存活时间(keepAliveTime)的配置需要根据任务的特点和系统资源的情况来确定。若任务处理时间较短且任务量持续较大,可以适当减少空闲线程的存活时间,避免资源浪费。若任务处理时间较长或任务量较小,可以适当增加空闲线程的存活时间,提高线程的复用率。 5. 拒绝策略(rejectedExecutionHandler)的选择需要根据业务需求和系统特点来确定。常见的拒绝策略有AbortPolicy(默认)、CallerRunsPolicy、DiscardPolicy和DiscardOldestPolicy。根据具体情况,可选择合适的拒绝策略,处理不能接受的任务。 总之,线程池参数配置的合理与否,需要充分考虑系统的负载情况、任务的特点和业务需求,通过调优参数来达到最佳的性能和效果。 ### 回答3: 线程池是一种用于管理和调度线程的机制,在并发编程中起到了重要的作用。但是线程池的性能和效果取决于参数配置。下面是线程池参数配置的一些建议。 1. 核心线程数(corePoolSize):是线程池中的最小线程数,即使线程池没有任务执行,核心线程也会一直存在。根据系统的负载和处理的任务数来调整核心线程数,一般建议设置为CPU核心数的1至2倍。 2. 最大线程数(maximumPoolSize):该参数线程池中最多容纳的线程数。根据系统的负载和任务的处理能力来调整最大线程数,一般建议设置为核心线程数的2至4倍。 3. 阻塞队列(workQueue):用于存放等待执行的任务。不同类型的任务可选择不同的队列,如有界队列ArrayBlockingQueue和无界队列LinkedBlockingQueue。选择合适的队列大小或容量取决于系统的负载和任务的数量,一般建议使用有界队列,避免任务过多导致系统资源耗尽。 4. 线程存活时间(keepAliveTime):当线程池中的线程超过核心线程数时,多余的空闲线程会被回收,该参数设置了空闲线程的存活时间。根据任务的类型和执行耗时来调整存活时间,以避免频繁的线程创建和销毁。 5. 拒绝策略(rejectedExecutionHandler):当线程池无法处理新提交的任务时,按照预先定义好的拒绝策略进行处理。常见的策略有AbortPolicy(丢弃任务并抛出异常)、CallerRunsPolicy(由调用者线程处理任务)等。选择合适的拒绝策略依赖于任务的重要性和系统的容忍性。 综上所述,线程池参数配置需要根据系统负载、任务数量和任务类型等因素进行调整。合理的配置可以提高系统的性能、响应速度和资源利用率,而不合理的配置可能会导致性能下降、资源浪费或系统崩溃。因此,在配置线程池参数时需综合考虑各种因素,根据实际情况进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值