线程池的应用

1. 为什么要使用线程池

1.1.降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
1.2提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行。
1.3提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

2.线程池的七大参数

2.1corePoolSize:核心线程池的数量,这个参数指定了线程池中的核心线程数。核心线程会一直存活,即使它们没有任务要执行。设置核心线程数可以预防线程的频繁创建和销毁,从而提高效率。
2.2maximumPoolSize:最大线程池数量,这是线程池允许创建的最大线程数。当工作队列满了之后,线程池会创建新线程,直到线程数达到maximumPoolSize。如果达到这个限制,新来的任务将会被拒绝处理。
2.3keepAliveTime:空闲线程存活时间,当线程数超过corePoolSize时,这个参数就会起作用。如果当前线程池中的线程数超过corePoolSize,
2.4keepAliveTime,那么这个线程将会被终止,直到线程池中的线程数回落到corePoolSize。
2.5workQueue:工作队列,这个参数是一个BlockingQueue,用于存放等待被执行的任务。这个队列只会处理Runnable任务。新任务被提交后,会先进入到此工作队列中,任务调度时再从队列中取出任务。
2.6threadFactory:线程工厂,一个ThreadFactory,用于设置创建线程的方式。可以通过线程工厂为线程池中的线程设置名字,定义优先级等。
2.7handler:拒绝策略,当线程池已经达到最大线程数,且工作队列也已满,新提交的任务就会通过这个拒绝执行处理器来处理。

3.四大拒绝策略

3.1AbortPolicy:这是默认的拒绝策略。当线程池无法接受新任务时,会抛出RejectedExecutionException异常。这意味着新任务会被立即拒绝,不会加入到任务队列中,也不会执行。通常情况下都是使用这种拒绝策略。
3.2CallerRunsPolicy:这种策略不会抛弃任务,也不会抛出异常。相反,它会让提交任务的线程自己执行该任务,如果执行程序已关闭,则会丢弃该任务。因此这种策略会降低对于新任务提交速度,影响程序的整体性能。适用于任务提交者能够承受任务执行的压力,但希望有一种缓冲机制的情况。
3.3DiscardPolicy:这个策略在任务队列已满时,会丢弃新的任务而且不会抛出异常。新任务提交后会被默默地丢弃,不会有任何提示或执行。这个策略一般用于日志记录、统计等不是非常关键的任务。
3.4DiscardOldestPolicy:这个策略也会丢弃新的任务,但它会先尝试将任务队列中最早的任务删除,然后再尝试提交新任务。如果任务队列已满,且线程池中的线程都在工作,可能会导致一些任务被丢弃。这个策略对于一些实时性要求较高的场景比较合适。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值