Java并发编程(三)-- 线程池及其常用实现

本文深入探讨Java线程池的实现原理、创建方法及三种常见实现:SingleThreadExecutor、FixedThreadPool和CachedThreadPool。讲解了线程池如何处理过多请求,包括基于定长的FixedThreadPool使用无界队列可能导致的任务堆积和内存问题,以及基于缓存的CachedThreadPool可能因创建过多线程导致的资源耗尽问题。
摘要由CSDN通过智能技术生成

Java里的线程池在平日的工作用的不算少,特别是有大量数据需要多线程处理的情形,那么大家在用之前是不是该刨根问底呢?
我们知道,线程池不光是Java里有涉及,各大开源框架、中间件、数据库等都会设计不同类型的线程池,比如Dubbo、Tomcat、MySQL等等等,因为使用线程池的好处如下:

  1. 通过重复利用已经创建的线程降低线程创建和销毁带来的性能损耗;
  2. 提高任务的响应速度,任务不需要等待线程创建就能执行,因为利用池中已有的线程;
  3. 增加了线程的可控性,线程如果无限创建,将严重消耗系统资源,那么可以使用线程池对线程统一分配和监控,使线程数量在健康的状态下。

线程池的实现原理

向线程池提交一个任务后,线程池的处理逻辑如下:
线程池

  1. 任务提交,执行execute方法后,检查当前运行的线程数据量是否达到核心线程池的大小,如果未达到,则创建新的线程去处理任务,否则进行第2步;
  2. 核心线程池满了后,任务将放置在同步队列中,等待核心线程的处理,即第4步。如果同步队列中存储的任务已经满了,将进行第3步;
  3. 同步队列满了后,则创建新的线程来处理任务,直到线程数量达到最大线程数量时,则进行第5步;
  4. 核心线程反复的从同步队列中拉取任务处理;
  5. 当前运行的线程数超过maximumPoolSize,任务将被拒绝,并执行拒绝策略(RejectedExecutionHandler)。

线程池的创建

我们可用通过ThreadPoolExecutor来创建定制化的线程池,如下:

new  ThreadPoolExecutor(corePoolSize,maximumPoolSize,KeepAliveTime,milliseconds,runnableTaskQueue,handler);

参数的含义如下:

  • 1、corePoolSize:核心线程数,任务进入线程池时,不管有无空闲的线程都会建立新的线程处理,直到线程数达到核心线程数。可通过方法直接使线程池建立核心线程数的线程(预热)。
  • 2、maximumPoolSize:最大线程数,线程池的任务队列满时,可继续创建线程数至最大线程数。任务队列无边界时,此参数无意义。
  • 3、keepAliveTime:除核心线程外的空闲线程保持存活时间,如果任务很多,并且任务执行的时间较短,则可以适当的调大线程的存活时间,提高线程的利用率。
  • 5、milliseconds:线程保持存活的时间单位,这里以毫秒为单位。
  • 6、runnableTaskQueue:任务队列,用来保存等待执行的任务的阻塞队列。可用以下阻塞队列实现:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值