线程池参数配置

4 篇文章 0 订阅

代码示例

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class CommonThreadPoolExecutor {
    private static final int CORE_POOL_SIZE = ?;
    private static final int MAX_POOL_SIZE = ?;
    private static final int QUEUE_CAPACITY = ?;
    private static final Long KEEP_ALIVE_TIME = ?;

    public static ThreadPoolExecutor executor = new ThreadPoolExecutor(
            CORE_POOL_SIZE,
            MAX_POOL_SIZE,
            KEEP_ALIVE_TIME,
            TimeUnit.SECONDS,
            new ArrayBlockingQueue<>(QUEUE_CAPACITY),
            new ThreadPoolExecutor.CallerRunsPolicy());
}

任务性质

CPU密集型任务

CPU密集型也叫计算密集型,指的是消耗系统的硬盘、内存性能,CPU要读写I/O(硬盘/内存)在很短时间就可以完成,CPU运算要花费很长时间,CPU密集任务只有在真正的多核CPU上才可能得到加速(通过多线程),而在单核CPU上,无论开几个模拟的多线程该任务都不可能得到加速,因为CPU总的运算能力就那些。

线程数配置

CPU密集型任务应配置尽可能小的线程,减少线程切换耗费的资源:

  • 线程数=CPU个数+1

IO密集型任务

涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,CPU大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但也有限度。常见的大部分任务都是IO密集型任务,比如:数据库数据交互、文件上传下载、网络数据传输等等。

线程数配置

IO操作不占用CPU,CPU大部分时间都在等待IO操作完成,为提高CPU利用率,应加大线程数量:

  • 线程数=2*CPU个数+1

依赖其他系统资源

任务对其他系统资源有依赖,如获取数据库返回结果,这时候等待时间过长,则CPU空闲的时间越长,增加线程数量设置,才能更好的利用CPU。

估算CPU合理值公式

  • 最佳线程数目 = (线程等待时间与线程CPU时间之比 + 1)* CPU可用核心数目

  • 最佳线程数目= CPU可用核心数目/(1-阻塞系数)

    • CPU密集型阻塞因子为0
    • IO密集型阻塞因子接近1
  • CPU可用核心数目获取(8核16线程,输出为16)

int Ncpu=Runtime.getRuntime().availableProcessors();

链接: 如何合理设置线程池大小.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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(由调用者线程处理任务)等。选择合适的拒绝策略依赖于任务的重要性和系统的容忍性。 综上所述,线程池参数配置需要根据系统负载、任务量和任务类型等因素进行调整。合理的配置可以提高系统的性能、响应速度和资源利用率,而不合理的配置可能会导致性能下降、资源浪费或系统崩溃。因此,在配置线程池参数时需综合考虑各种因素,根据实际情况进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值