Java线程池

本文深入探讨Java线程池的原理与应用,包括线程池的参数、工作类、拒绝策略,以及如何选择合适的线程池。分析了FixedThreadPool、SingleThreadExecutor和CachedThreadPool的弊端,并介绍了ScheduledThreadPoolExecutor与Timer的区别。同时,提供了线程池数量确定的建议。
摘要由CSDN通过智能技术生成

线程池

线程池由两个核心数据结构组成:

1、线程集合(workers):存放执行任务的线程,是一个HashSet;

2、任务等待队列(workQueue):存放等待线程池调度执行的任务,是一个阻塞式队列BlockingQueue;

就是一个线程集合workerSet和一个阻塞队列workQueue。当用户向线程池提交一个任务(也就是线程)时,线程池会先将任务放入workQueue中。workerSet中的线程会不断的从workQueue中获取线程然后执行。当workQueue中没有任务的时候,worker就会阻塞,直到队列中有任务了就取出来继续执行。

线程池的好处:

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

  • maximumPoolSize: 线程池最大线程数

  • keepAliveTime: 线程池中的线程出超过核心线程数时,空闲线程的最大存活时间

  • workQueue: 任务队列,需要是BlockingQueue,常见的有SynchronousQueue(无队列直接递交的队列),ArrayBlockingQueue, LinkedBlockingQueue(有界无界两种),DelayQueue(延迟队列), PriorityBlockingQueue(优先级队列)等

  • threadFactory: 创建线程的工厂,可以控制线程名称、priority等

  • handler: 拒绝策略,当队列已满,并且线程数量已经达到maximumPoolSize时,再提交的任务会交给RejectedExecutionHandler来处理,

    • 常见的拒绝策略有AbortPolicy(直接拒绝并抛出异常),
    • CallerRunsPoicy(由所在者的线程进行处理,这种策略会降低对于新任务提交速度,影响程序的整体性能。如果您的应用程序可以承受此延迟并且你要求任何一个任务请求都要被执行的话,你可以选择这个策略。),
    • DiscardPolicy(不处理新任务,直接丢弃掉ÿ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值