当前位置:首页 > 经验 >

2种线程池底层实现原理(线程池底层结构图解)

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

点击上方关注,每天学习一个Java知识点

原创: 林湾村龙猫

程序的运行,其本质上,是对系统资源(CPU、内存、磁盘、网络等等)的使用。如何高效的使用这些资源是我们编程优化演进的一个方向。今天说的线程池就是一种对CPU利用的优化手段。

网上有不少介绍如何使用线程池的文章,那我想说点什么呢?我希望通过学习线程池原理,明白所有池化技术的基本设计思路。遇到其他相似问题可以解决。

池化技术

前面提到一个名词——池化技术,那么到底什么是池化技术呢?

池化技术简单点来说,就是提前保存大量的资源,以备不时之需。在机器资源有限的情况下,使用池化技术可以大大的提高资源的利用率,提升性能等。

在编程领域,比较典型的池化技术有:

线程池、连接池、内存池、对象池等。

本文主要来介绍一下其中比较简单的线程池的实现原理,希望读者们可以举一反三,通过对线程池的理解,学习并掌握所有编程中池化技术的底层原理。

创建一个线程

在Java的并发编程中,线程是十分重要的,在Java中,创建一个线程比较简单:

2种线程池底层实现原理,线程池底层结构图解(1)

我们通过创建一个线程对象,并且实现Runnable接口就可以实现一个简单的线程。可以利用上多核CPU。当一个任务结束,当前线程就接收。

但很多时候,我们不止会执行一个任务。如果每次都是如此的创建线程->执行任务->销毁线程,会造成很大的性能开销。

那能否一个线程创建后,执行完一个任务后,又去执行另一个任务,而不是销毁。这就是线程池。

这也就是池化技术的思想,通过预先创建好多个线程,放在池中,这样可以在需要使用线程的时候直接获取,避免多次重复创建、销毁带来的开销。

线程池的简单使用

以下代码,是在Java中创建线程池:

2种线程池底层实现原理,线程池底层结构图解(2)

Jdk提供给外部的接口也很简单。直接调用ThreadPoolExecutor构造一个就可以了,也可以通过Executors静态工厂构建,但一般不建议。

可以看到,开发者想要在代码中使用线程池还是比较简单的,这得益于Java给我们封装好的一系列API。但是,这些API的背后是什么呢,让我们来揭开这个迷雾,看清线程池的本质。

线程池构造函数

通常,一般构造函数会反映出这个工具或这个对象的数据存储结构。

2种线程池底层实现原理,线程池底层结构图解(3)

如果把线程池比作一个公司。公司会有正式员工处理正常业务,如果工作量大的话,会雇佣外包人员来工作。闲时就可以释放外包人员以减少公司管理开销。一个公司因为成本关系,雇佣的人员始终是有最大数。如果这时候还有任务处理不过来,就走需求池排任务。
  • acc : 获取调用上下文
  • corePoolSize: 核心线程数量,可以类比正式员工数量,常驻线程数量。
  • maximumPoolSize: 最大的线程数量,公司最多雇佣员工数量。常驻 临时线程数量。
  • workQueue:多余任务等待队列,再多的人都处理不过来了,需要等着,在这个地方等。
  • keepAliveTime:非核心线程空闲时间,就是外包人员等了多久,如果还没有活干,解雇了。
  • threadFactory: 创建线程的工厂,在这个地方可以统一处理创建的线程的属性。每个公司对员工的要求不一样,恩,在这里设置员工的属性。
  • handler:线程池拒绝策略,什么意思呢?就是当任务实在是太多,人也不够,需求池也排满了,还有任务咋办?默认是不处理,抛出异常告诉任务提交者,我这忙不过来了。
添加一个任务

接着,我们看一下线程池中比较重要的execute方法,该方法用于向线程池中添加一个任务。

2种线程池底层实现原理,线程池底层结构图解(4)

首页 123下一页

栏目热文

自己动手实现线程池(如何实现一个完整的线程池)

自己动手实现线程池(如何实现一个完整的线程池)

前言线程池大家在开发中应该有都有用过,其实线程池就是把一堆线程创建好了放在一个容器中,需要用的时候就直接拿出来用,用完之...

2022-11-03 05:50:25查看全文 >>

线程池的工作原理图解(线程池架构原理图)

线程池的工作原理图解(线程池架构原理图)

为什么需要线程池我们有两种常见的创建线程的方法,一种是继承Thread类,一种是实现Runnable的接口,Thread...

2022-11-03 05:53:12查看全文 >>

中尉转业能安排什么职位(2022军官转业费一览表)

中尉转业能安排什么职位(2022军官转业费一览表)

经历了2021跟2022两次退役之后,很多人清醒地认识到,想要趁着年轻走,难了。想要在30岁之前就转业回家,基本不可能了...

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

上士相当什么级别(上士退伍安排工作吗)

上士相当什么级别(上士退伍安排工作吗)

2月28日关于现役士兵衔级制度的决定通过了新的士兵军衔制度2022年3月31日施行后将会给部队,特别是士兵群体带来怎样的...

2022-11-03 05:20:02查看全文 >>

副连职中尉相当于什么(副连职对应中尉还是少尉)

副连职中尉相当于什么(副连职对应中尉还是少尉)

“连”是属于军队的基层组织,在部队中有着极其重要的位置。新兵下连队,也就是说把新兵分配各个基层部队,而军官下基层挂职也就...

2022-11-03 05:18:55查看全文 >>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

文档排行