`
y806839048
  • 浏览: 1106739 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

线程池满了如何处理及spring参数设置:

阅读更多

线程池满了如何处理及spring参数设置:

 

 

多线程的问题,不仅仅考虑在代码中用线程池,在spring等上也许配置

并发问题也不是,单纯的在代码中同步,数据库zk等,也不仅仅是在nginx,tomcat调优也在jvm数据库有样的设置地方

 

 

线程池简介

自JDK1.5,Java吊炸天的并发包就提供线程池java.util.concurrent.ThreadPoolExecutor ,先来看看其各个字段的含义: 
corePoolSize 核心线程数,指保留的线程池大小(不超过maximumPoolSize值时,线程池中最多有corePoolSize 个线程工作)。 
maximumPoolSize 指的是线程池的最大大小(线程池中最大有corePoolSize 个线程可运行)。 
keepAliveTime 指的是空闲线程结束的超时时间(当一个线程不工作时,过keepAliveTime 长时间将停止该线程)。 
unit 是一个枚举,表示 keepAliveTime 的单位(有NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS,7个可选值)。 
workQueue 表示存放任务的队列(存放需要被线程池执行的线程队列)。 
handler 拒绝策略(添加任务失败后如何处理该任务).

关于corePoolSize、maxPoolSize、queueCapacity之间的关系: corePoolSize为初始线程个数,当corePoolSize的线程都在执行中时,则将Runnable临时放入queueCapacity的缓冲队列中等待,当queueCapacity满了时,才会将线程个数从corePoolSize扩展至maxPoolSize,如果此时queueCapacity缓存队列任然是满的,则后续Runnable对象加入其中时就会被abort抛弃

这位兄弟提供了很好的代码说明例子,具体可参见:http://dmwdmc.iteye.com/blog/1882475。例子中有模拟整个线程池都满了抛弃后面任务的场景。

线程池之坑1

说明:如下线程池配置均为使用的spring封装过得线程池。 
坑出现的场景:一个接口,需要四次次访问数据库,而且四次结果之间也没有必然联系,何不把这个四次访问数据库操作分别放入四个线程中同时去访问呢,从而大大节省时间。 
OK,楼主就这么干了,并且这四个线程都丢到一个统一的线程池中去执行。那么坑来了,该接口常常于一天的固定时间有着“惊喜”的访问量,上线第二天,六个tomcat全部挂掉,查看堆dump文件,发现出现了OOM错误,而且六个tomcat几乎相差不多的时间出现。楼主心虚地就想到了自己加的线程池。下面是楼主的线程池配置,各位鉴赏(配置是直接从其他人的配置拷贝过来,没有多想):

    <bean id="resQueryBaseInfoExecutor"
          class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <property name="threadNamePrefix" value="resQueryBaseInfoExecutor-" />
        <property name="corePoolSize" value="5" />
        <property name="keepAliveSeconds" value="100" />
        <property name="maxPoolSize" value="10" />
        <property name="queueCapacity" value="100000" />
    </bean>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

其中queueCapacity被设置为100000,目的是为了保证所有任务都没接受而不会因为线程池满了而被抛弃,但显然当缓存队列真的到了10W时,OOM应该就不远了… 
楼主深思了原因:corePoolSize过小,导致线程池吞吐量过小,而queueCapacity配置过大,加上吞吐能力差,直接导致等待队列达到10W个对象,导致JVM顺利地OOM了,从而导致整个应用挂掉,造成宕机严重问题。

线程池之坑2

corePoolSize配置小,queueCapacity也配置小,导致线程池吞吐能力差,缓存数量少,很有可能在流量稍微上来之后拒绝后面的线程,导致数据操作丢失,这也是楼主亲身经历的:

    <bean id="resQueryBaseInfoExecutor"
          class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <property name="threadNamePrefix" value="resQueryBaseInfoExecutor-" />
        <property name="corePoolSize" value="5" />
        <property name="keepAliveSeconds" value="100" />
        <property name="maxPoolSize" value="10" />
        <property name="queueCapacity" value="500" />
    </bean>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

因此综上,正确的估算接口的流量、以及每个线程任务执行的大概时间,计算出每个线程的吞吐量,才能正确设置corePoolSize、maxPoolSize、queueCapacity三个参数。

分享到:
评论

相关推荐

    Spring基于线程池的定时任务线挰异常实践

    在Spring框架中,定时任务和线程池是两个非常重要的组件,它们可以帮助我们实现高效的后台任务处理。这篇博文“Spring基于线程池的定时任务线程异常实践”深入探讨了如何在Spring中结合线程池来执行定时任务,并且...

    spring线程池(同步、异步).docx

    在Spring框架中,线程池的使用是实现并发和异步任务执行的关键工具。线程池的概念源于Java的`java.util.concurrent.ExecutorService`接口,它允许我们管理一组可重用的工作线程,以提高系统效率并减少资源消耗。...

    Spring3.2.6定时任务+线程池.docx

    Spring框架作为Java企业级应用开发中的一个重要组成部分,提供了丰富的支持来简化线程池及定时任务的管理。本文将基于Spring3.2.6版本,详细介绍如何配置线程池以及定时任务,并结合具体实例进行解析。 #### 二、...

    Spring Boot利用@Async如何实现异步调用:自定义线程池

    Spring Boot利用@Async实现异步调用:自定义...5. 自定义线程池的参数设置 6. 使用自定义线程池来控制异步调用的并发性 本文为大家提供了一些有价值的信息,可以帮助开发者更好地使用Spring Boot来实现异步调用。

    最全redis线程池实现,Spring支持,redis Cluster线程池,主从Redis读写分离,sentenl读写分离等

    在Jedis中,我们可以通过`poolConfig`设置线程池的最大连接数、最大空闲连接、超时时间等参数。而在Lettuce中,我们可以使用`PoolingClientConfiguration`来配置线程池。 2. **Redis Cluster线程池**: 当我们需要...

    Spring Boot 自定义异步线程池的两种方式Demo

    在Spring Boot应用中,我们经常需要处理大量的并发请求,这时自定义异步线程池就显得尤为重要。异步处理能够提高应用的响应速度,避免主线程阻塞,从而提升系统性能。本文将详细介绍两种在Spring Boot中实现自定义...

    Spring线程池demo

    在Java开发领域,Spring框架是应用最广泛的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器。...理解并掌握Spring线程池的使用,对于提升Java应用的并发处理能力和系统稳定性具有重要意义。

    spring 多线程队列执行

    - **饱和策略**:当任务队列已满且线程池中的线程数量达到`maxPoolSize`时,Spring提供了多种饱和策略,如丢弃策略、CallerRunsPolicy(由调用者线程执行任务)等。 - **线程生命周期**:Spring允许自定义线程工厂...

    Spring Cloud Hystrix线程池不足的解决方法

    "Spring Cloud Hystrix线程池不足解决方法总结" 在分布式系统中,线程池的管理对于系统的性能和可靠性具有重要影响。Spring Cloud Hystrix作为一种流行的分布式系统解决方案,提供了完善的线程池管理机制。然而,在...

    Spring线程池ThreadPoolTaskExecutor配置详情

    然后,我们通过property元素设置了线程池的几个重要参数: * corePoolSize:线程池维护线程的最少数量。 * keepAliveSeconds:允许的空闲时间。 * maxPoolSize:线程池维护线程的最大数量。 * queueCapacity:缓存...

    使用线程池ThreadPoolExecutor 抓取论坛帖子列表

    在实际应用中,我们可能还需要关注线程池的监控和调优,例如通过JMX或Spring的`ThreadPoolTaskExecutor`进行监控,以及根据系统负载动态调整线程池参数。 至于提到的"工具"标签,可能指的是使用一些工具库如Apache ...

    解决Spring session(redis存储方式)监听导致创建大量redisMessageListenerContailner-X线程问题

    本文不仅提供了问题的分析和解决方案,还指出了在使用异步方法时,应根据实际业务场景考虑是否需要自定义线程池,以及如何设置线程池参数以达到最佳性能。对于希望深入了解Spring Session和Redis结合使用的开发者来...

    spring boot注解事务+多线程

    同时,Spring Boot提供了多种工具来管理和控制多线程,如ThreadPoolTaskExecutor,它允许我们自定义线程池参数,如核心线程数、最大线程数、线程存活时间等。例如: ```java @Configuration public class ...

    ClickHouse线程池对接Druid.zip

    同时,根据线程池的运行情况调整线程池参数,以达到最佳的并发处理效果。 总的来说,将ClickHouse与Druid数据源连接池结合使用,可以充分利用Druid的性能优势,提高ClickHouse服务的稳定性和效率。通过对Druid的...

    Spring boot注解@Async线程池实例详解

    在设置系统自定义线程池代替默认线程池时,虽可通过多种模式设置,但替换默认线程池最终产生的线程池有且只能设置一个(不能设置多个类继承 AsyncConfigurer)。自定义线程池有如下模式: * 重新实现接口 ...

    netty4与spring集成

    可以创建一个全局的 ExceptionHandler,通过 Spring 注入并设置到 ChannelPipeline 中,以便捕获并处理所有可能的网络异常。 8. **测试与监控**: 使用 Spring Boot Actuator 或其他监控工具,可以监控 Netty 服务器...

    spring定时任务依赖的jar包

    4. **ThreadPoolTaskScheduler**:如果你需要更复杂的调度需求,可以使用`ThreadPoolTaskScheduler`,它允许你自定义线程池参数,如线程数量、队列容量等。 5. **Quartz集成**:虽然Spring Task已经很强大,但如果...

    Spring定时任务@Scheduled例子

    它可以设置多个参数来控制任务的执行方式和频率,如: - `fixedRate`: 以固定的延迟时间执行,单位是毫秒。 - `fixedDelay`: 上一次执行结束到下一次执行开始的间隔,也是以毫秒计。 - `cron`: 使用Cron表达式...

    Spring提供的线程池支持[借鉴].pdf

    Spring框架在2.0版本之后引入了对线程池的支持,主要是受到了Java SE 5.0中`java.util.concurrent.Executor`接口的影响。`TaskExecutor`接口是Spring为各种线程池服务提供的一种抽象,它的目的是统一客户端的视图,...

    SpringBootz整合mybatis、线程池、定时任务等

    Spring Boot允许我们在配置文件中定义线程池参数,如核心线程数、最大线程数、队列大小等,从而定制符合应用需求的线程池。 接下来,**访问日志的记录**是系统监控和问题排查的重要手段。Spring Boot可以通过...

Global site tag (gtag.js) - Google Analytics