线程池的用法及配置


1.直接掉用
ThreadPoolTaskExecutor poolTaskExecutor =
new ThreadPoolTaskExecutor(); 
//线程池所使用的缓冲队列 
poolTaskExecutor.setQueueCapacity( 200 ); 
//线程池维护线程的最少数量 
poolTaskExecutor.setCorePoolSize( 5 ); 
//线程池维护线程的最大数量 
poolTaskExecutor.setMaxPoolSize( 1000 ); 
//线程池维护线程所允许的空闲时间 
poolTaskExecutor.setKeepAliveSeconds( 30000 ); 
poolTaskExecutor.initialize();
2.通过配置文件
<bean id= "poolTaskExecutor"      class = "org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" >
    <!-- 核心线程数,默认为 1 -->
    <property name= "corePoolSize" value= "5" />
    <!-- 最大线程数,默认为Integer.MAX_VALUE -->
    <property name= "maxPoolSize" value= "50" />
    <!-- 队列最大长度,一般需要设置值>=notifyScheduledMainExecutor.maxNum;默认为Integer.MAX_VALUE -->
    <property name= "queueCapacity" value= "2000" />
    <!-- 线程池维护线程所允许的空闲时间,默认为60s -->
    <property name= "keepAliveSeconds" value= "100" />
    <!-- 线程池对拒绝任务(无线程可用)的处理策略,目前只支持AbortPolicy、CallerRunsPolicy;默认为后者 -->
    <property name= "rejectedExecutionHandler" >
        <!-- AbortPolicy:直接抛出java.util.concurrent.RejectedExecutionException异常 -->
        <!-- CallerRunsPolicy:主线程直接执行该任务,执行完之后尝试添加下一个任务到线程池中,可以有效降低向线程池内添加任务的速度 -->
        <!-- DiscardOldestPolicy:抛弃旧的任务、暂不支持;会导致被丢弃的任务无法再次被执行 -->
        <!-- DiscardPolicy:抛弃当前任务、暂不支持;会导致被丢弃的任务无法再次被执行 -->
        <bean class = "java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
    </property>
</bean>

### 回答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、付费专栏及课程。

余额充值