当前位置:首页 > 经验 >

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

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

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

线程的创建和销毁,都涉及到系统调用,比较消耗系统资源,所以就引入了线程池技术,避免频繁的线程创建和销毁。

在Java中有一个Executors工具类,可以为我们创建一个线程池,其本质就是new了一个ThreadPoolExecutor对象。线程池几乎也是面试必考问题。本节结合源代码,说说ThreadExecutor的工作原理

一、线程池创建

先看一下ThreadPoolExecutor参数最全的构造方法:

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

  • corePoolSize:线程池的核心线程数,说白了就是,即便是线程池里没有任何任务,也会有corePoolSize个线程在候着等任务。

  • maximumPoolSize:最大线程数,不管你提交多少任务,线程池里最多工作线程数就是maximumPoolSize。

  • keepAliveTime:线程的存活时间。当线程池里的线程数大于corePoolSize时,如果等了keepAliveTime时长还没有任务可执行,则线程退出。

  • unit:这个用来指定keepAliveTime的单位,比如秒:TimeUnit.SECONDS。

  • workQueue:一个阻塞队列,提交的任务将会被放到这个队列里。

  • threadFactory:线程工厂,用来创建线程,主要是为了给线程起名字,默认工厂的线程名字:pool-1-thread-3。

  • handler:拒绝策略,当线程池里线程被耗尽,且队列也满了的时候会调用。

以上就是创建线程池时用到的参数,面试中经常会有面试官问到这个问题。

二、线程池执行流程

这里用一个图来说明线程池的执行流程

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

任务被提交到线程池,会先判断当前线程数量是否小于corePoolSize,如果小于则创建线程来执行提交的任务,否则将任务放入workQueue队列,如果workQueue满了,则判断当前线程数量是否小于maximumPoolSize,如果小于则创建线程执行任务,否则就会调用handler,以表示线程池拒绝接收任务。

这里以jdk1.8.0_111的源代码为例,看一下具体实现。

1、先看一下线程池的executor方法

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

  • 判断当前活跃线程数是否小于corePoolSize,如果小于,则调用addWorker创建线程执行任务

  • 如果不小于corePoolSize,则将任务添加到workQueue队列。

  • 如果放入workQueue失败,则创建线程执行任务,如果这时创建线程失败(当前线程数不小于maximumPoolSize时),就会调用reject(内部调用handler)拒绝接受任务。

2、再看下addWorker的方法实现

这块代码是在创建非核心线程时,即core等于false。判断当前线程数是否大于等于maximumPoolSize,如果大于等于则返回false,即上边说到的③中创建线程失败的情况。

addWorker方法的下半部分:

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

首页 123下一页

栏目热文

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

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

点击上方关注,每天学习一个Java知识点原创: 林湾村龙猫程序的运行,其本质上,是对系统资源(CPU、内存、磁盘、网络等...

2022-11-03 05:40:00查看全文 >>

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

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

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

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: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查看全文 >>

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

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

作者:指尖上的榴莲www.jianshu.com/p/704a6c5d337c一.概述线程池,顾名思义就是存放线程的池子...

2022-11-03 05:47:00查看全文 >>

文档排行