公司发的小师妹问我java中的线程池,这么讲可还行?

本文详细介绍了Java线程池的实现原理,包括任务提交流程、线程池的创建与参数解析、常用阻塞队列以及四种饱和策略。此外,还讲解了如何自定义线程池、关闭线程池的方法以及合理配置线程池的原则,最后讨论了使用线程池带来的降低资源消耗、提高响应速度和线程可管理性的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

最近在准备面试资料,就看了一下多线程相关的文章,但是找了很多文章发现大家写的差不多一样,有的文章同样的内容,但是给出的答案却是不一样的,所有我就自己参考一些自己买的书籍和看一下源码总结了一下,也就是以下内容。
这里都是线程池相关的内容,也就是ThreadPoolExecutor这个类相关的内容,至于Executors框架,我会单独再写一篇文章进行详细的写一下,也作为自己的面试总结。

在这里插入图片描述


一、线程池的实现原理

1、当提交一个任务到线程池时,线程池的处理流程

1、判断核心线程池里的核心线程是否已满

  • 是,判断工作队列是否已经满了
  • 否,不管核心线程有没有空闲,都创建一个新的线程执行这个任务

2、工作队列是否已经满了

  • 已满,判断线程池是否满了
  • 未满,将任务存储在工作队列里

3、判断线程池是否满了【核心线程以外的可以创建的线程,最大线程数】

  • 已满,交给饱和策略handle处理无法执行的任务
  • 未满,创建一个新的线程执行这个任务

以上流程的图解

在这里插入图片描述

  • 1、 线程池刚创建时是没有线程的,并且里面包含了一个任务队列。

  • 2、 小于核心线程数(corePoolSize),不管有没有空闲的核心线程任务来了都创建一个新的线程;

  • 3、 大于等于核心线程数(corePoolSize)且小于设置的最大线程数(maximumPoolSize),先加入到任务队列(workQueue)里;

  • 4、 队列满了再继续创建线程,直到线程数到达设置的最大线程数(maximumPoolSize);

  • 5、 如果达到最大线程数(maximumPoolSize)且任务队列(workQueue)满了,则通过 handler 所指定的饱和策略来处理此任务;

  • 6、 当线程池中的线程数量大于核心线程数(maximumPoolSize)时,如果某个线程空闲时间超过keepAliveTime,线程将被终止,这样线程池可以动态的调整池中的线程数。

2、ThreadPoolExecutor执行executor()方法的四种情况

  • 1、 如果当前运行的线程少于corePoolSize,则创建新的线程来执行任务【全局锁】

  • 2、 如果运行的线程数大于等于corePoolSize,则将任务加入BlockingQueue阻塞队列

  • 3、 如果BlockingQueue阻塞队列已满,无法加入新的任务,则创建新的线程来处理【全局锁】

  • 4、 如果创建的新的线程促使正在运行的线程数超过了maximumPoolSize,任务将被拒绝,并调用RejectedExecutionHandlerrejectedExecution()方法

3、线程池里的线程执行任务分两种情况

  • 1、executor()方法中创建一个线程,会让这个线程执行当前任务

  • 2、线程在执行完当前任务以后,队列里有任务就会不停的从BlockingQueue中取任务执行。

二、线程池的使用

1、线程池的创建

1.1、new 一个ThreadPoolExecutor调用的构造方法的源码

    public ThreadPoolExecutor(i
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞流2023

小主,破费了,回头请你喝咖啡!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值