不使用Executors默认线程池,而自定义线程池的原因

首先是以下几点:

  1. 不适应特定需求:默认线程池的配置通常是一般性的,可能并不适合特定应用的需求。这意味着,对于某些高并发的应用,默认线程池可能会导致资源的浪费或不足,进而影响性能。

  2. 拥塞和延迟:使用默认线程池时,线程数量和工作队列的配置往往是固定的。如果应用程序的负载超出了默认设定,可能会导致请求的延迟或拒绝服务。这在高峰期尤为明显。

  3. 难以监控和调优:默认线程池的参数配置较少,不便于开发者根据实际情况进行监控和调优。如果没有足够的监控手段,可能会很难发现和解决性能瓶颈。

  4. 不易维护:默认线程池的行为不够透明,开发人员在遇到问题时可能难以追踪和排查。这使得运维和调试变得更加复杂。

  5. 资源管理:默认线程池可能没有考虑到系统的整体资源管理,如 CPU 和内存的利用率,可能导致资源的滥用或不足。
    具体来说,Executors创建的线程池默认使用LinkedBlockingQueue作为任务队列,这是一个无界队列。在高并发场景下,如果任务生产速度远超过消费速度,该队列会无限制地增长,最终可能引发内存溢出错误(OOM),严重影响系统的稳定性。
    通过Executors创建的线程无法自定义命名,这不利于在出现问题时进行故障排查。线程命名可以帮助我们更快地定位到是哪个业务模块或哪个部分的代码出现的问题。 

  所以我们尽量要自己创建线程池,自定义的 线程池有七个参数,它们分别有什么作用呢?

  1. corePoolSize(核心线程数)

    • 这个参数指定了线程池中的核心线程数量。即使这些线程处于空闲状态,线程池也会保留它们,直到调用 allowCoreThreadTimeOut 方法设置为 true。核心线程负责处理提交的任务。
  2. maximumPoolSize(最大线程数)

    • 这个参数指定了线程池中允许的最大线程数。当提交的任务数量超过核心线程数,且队列已满时,线程池会创建新线程,直到达到这个最大值。
  3. keepAliveTime(线程存活时间)

    • 这个参数定义了非核心线程在空闲状态下存活的时间。超过这个时间未被使用的非核心线程会被终止。这个参数适用于非核心线程,只有当线程数超过核心线程数并且处于空闲状态时才会生效。
  4. timeUnit(时间单位)

    • 这个参数用于指定 keepAliveTime 的时间单位,例如可以是秒、毫秒等。它决定了如何解读 keepAliveTime 这个值。
  5. workQueue(任务队列)

    • 这个参数指定了任务被提交到线程池后存放的地方。可以选择例如 ArrayBlockingQueue(有界阻塞队列)、LinkedBlockingQueue(无界阻塞队列)等不同类型的队列。它的选择会影响任务的处理策略。
  6. handler(拒绝策略)

    • 当线程池无法接受新的任务(例如达到最大线程数和队列满时),这个参数定义了采取的策略。常见的拒绝策略有 AbortPolicy(抛出异常)、CallerRunsPolicy(由调用线程处理任务)等。
  7. threadFactory(线程工厂)

    • 这个参数用于创建新线程的工厂,可以指定自定义线程的名字、优先级等,可以帮助在调试和监控时更好地识别线程。

  在实际开发过程中,我们要根据业务的需要去创建合适的自定义线程池 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值