当前位置:首页 > 经验 >

线程池的原理及底层实现(线程池的结构和原理)

来源:原点资讯(www.yd166.com)时间:2022-11-03 05:47:00作者:YD166手机阅读>>

作者:指尖上的榴莲

www.jianshu.com/p/704a6c5d337c

一.概述

线程池,顾名思义就是存放线程的池子,池子里存放了很多可以复用的线程。

如果不用类似线程池的容器,每当我们需要执行用户任务的时候都去创建新的线程,任务执行完之后线程就被回收了,这样频繁地创建和销毁线程会浪费大量的系统资源。

因此,线程池通过线程复用机制,并对线程进行统一管理,具有以下优点:

  • 降低系统资源消耗。通过复用已存在的线程,降低线程创建和销毁造成的消耗;
  • 提高响应速度。当有任务到达时,无需等待新线程的创建便能立即执行;
  • 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗大量系统资源,还会降低系统的稳定性,使用线程池可以进行对线程进行统一的分配、调优和监控。

ThreadPoolExecutor是线程池框架的一个核心类,本文通过对threadPoolExecutor源码的分析(基于JDK 1.8),来深入分析线程池的实现原理。

二.ThreadPoolExecutor类的属性

先从ThreadPoolExecutor类中的字段开始:

线程池的原理及底层实现,线程池的结构和原理(1)

在ThreadPoolExecutor类的这些属性中,线程池状态是控制线程池生命周期至关重要的属性,这里就以线程池状态为出发点进行研究。

通过上面的源码可知,线程池的运行状态总共有5种,其值和含义分别如下:

  • RUNNING: 高3位为111,接受新任务并处理阻塞队列中的任务
  • SHUTDOWN: 高3位为000,不接受新任务但会处理阻塞队列中的任务
  • STOP:高3位为001,不会接受新任务,也不会处理阻塞队列中的任务,并且中断正在运行的任务
  • TIDYING: 高3位为010,所有任务都已终止,工作线程数量为0,线程池将转化到TIDYING状态,即将要执行terminated()钩子方法
  • TERMINATED: 高3位为011,terminated()方法已经执行结束

然而,线程池中并没有使用单独的变量来表示线程池的运行状态,而是使用一个AtomicInteger类型的变量ctl来表示线程池的控制状态,其将线程池运行状态与工作线程的数量打包在一个整型中,用高3位来表示线程池的运行状态,低29位来表示线程池中工作线程的数量,对ctl的操作主要参考以下几个函数:

线程池的原理及底层实现,线程池的结构和原理(2)

接下来,我们看一下线程池状态的所有转换情况,如下:

  • RUNNING -> SHUTDOWN:调用shutdown(),可能在finalize()中隐式调用
  • (RUNNING or SHUTDOWN) -> STOP:调用shutdownNow()
  • SHUTDOWN -> TIDYING:当缓存队列和线程池都为空时
  • STOP -> TIDYING:当线程池为空时
  • TIDYING -> TERMINATED:当terminated()方法执行结束时

通常情况下,线程池有如下两种状态转换流程:

  • RUNNING -> SHUTDOWN -> TIDYING -> TERMINATED
  • RUNNING -> STOP -> TIDYING -> TERMINATED

三.ThreadPoolExecutor类的构造方法

通常情况下,我们使用线程池的方式就是new一个ThreadPoolExecutor对象来生成一个线程池。接下来,先看ThreadPoolExecutor类的构造函数:

线程池的原理及底层实现,线程池的结构和原理(3)

接下来,看下最后一个构造函数的具体实现:

线程池的原理及底层实现,线程池的结构和原理(4)

栏目热文

线程池实现的四种方式(线程池的四种状态)

线程池实现的四种方式(线程池的四种状态)

线程池的创建方式有四种,分别为手动创建,动态创建和自动生成。手动创建:创建方法有两种:(1)通过new来新建一个线...

2022-11-03 05:56:05查看全文 >>

线程池的七个参数(线程池各个参数含义)

线程池的七个参数(线程池各个参数含义)

所谓的线程池的 7 大参数是指,在使用 ThreadPoolExecutor 创建线程池时所设置的 7 个参数,如以下源...

2022-11-03 05:30:06查看全文 >>

高并发三种解决方法(大数据高并发解决方案)

高并发三种解决方法(大数据高并发解决方案)

一、什么是高并发高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通...

2022-11-03 06:02:03查看全文 >>

线程池的工作原理及图解(线程池源码深度解析)

线程池的工作原理及图解(线程池源码深度解析)

前言本文以程序员做需求的例子,比喻线程池的工作过程。以故事白话的方式展开,跟大家阐述线程池工作原理,以方便大家更好理解线...

2022-11-03 05:41:56查看全文 >>

线程池的基本原理看完就懂了(线程池原理非常详细)

线程池的基本原理看完就懂了(线程池原理非常详细)

随着cpu核数越来越多,不可避免的利用多线程技术以充分利用其计算能力。所以,多线程技术是服务端开发人员必须掌握的技术。线...

2022-11-03 05:58:05查看全文 >>

线程池架构原理图解(线程池工作原理及方法)

线程池架构原理图解(线程池工作原理及方法)

上篇《》文章末尾,有朋友留言提到文中的场景是IO密集型操作,不是CPU密集操作,不需要使用线程池,我猜这位朋友可能想表达...

2022-11-03 05:27:26查看全文 >>

线程池的使用实例(线程池的使用场景)

线程池的使用实例(线程池的使用场景)

线程池做什么: 网络请求通常有两种形式:第一种,请求不是很频繁,而且每次连接后会保持相当一段时间来读数据或者写数据,最后...

2022-11-03 05:37:09查看全文 >>

一张图看懂线程和进程(进程与线程通俗讲解)

一张图看懂线程和进程(进程与线程通俗讲解)

进程我们都知道计算机的核心是CPU,它承担了所有的计算任务;而操作系统是计算机的管理者,它负责任务的调度、资源的分配和管...

2022-11-03 05:49:08查看全文 >>

线程池的四种实现方式(线程池创建的几种方法)

线程池的四种实现方式(线程池创建的几种方法)

不经常使用线程池的童鞋,还有对几种线程的使用不甚了解的童鞋,可以读一下此文,并关注后续线程池相关文章连载。本篇内容大纲:...

2022-11-03 05:36:42查看全文 >>

mycat和sharding优缺点(mycat的替代品)

mycat和sharding优缺点(mycat的替代品)

在我们的项目发展到一定阶段之后,随着数据量的增大,分库分表就变成了一件非常自然的事情。常见的分库分表方式有两种:客户端模...

2022-11-03 05:56:38查看全文 >>

文档排行