多线程——线程池

article/2025/8/12 8:05:02

课程:
在这里插入图片描述

什么是线程池

可以自己实现这个功能,自己写一个线程池
jdk也给提供了线程池
在这里插入图片描述

为什么要有线程池

在这里插入图片描述
在这里插入图片描述

Executor框架

在这里插入图片描述
在这里插入图片描述
任务:就是代码
执行:谁去执行这个代码,之前是Thread执行的,
在这里插入图片描述
thread:
在这里插入图片描述
Executor:
在这里插入图片描述

Executor框架的接口与类结构

什么是juc

传统的java实现线程:
Thread类和Runnable都是java,lang包下的。

jdk从1.5开始,提供了新的三个包,简称为juc,这三个包用来实现并发编程的:
在这里插入图片描述

Executor框架结构:

在这里插入图片描述

实现:

在这里插入图片描述

Executors

像是Arrays:一个接口名+s, 是表示jdk里的对于这个接口类型的一个工具类的包装。

上面创建的时候要传很多参数,所以用这个工具类,不用去传参数直接获取想要的线程池,这种里面参数是不能修改的了,上面的可以修改我们想要的参数
在这里插入图片描述
源码:
在这里插入图片描述
接收的接口:
在这里插入图片描述

线程池的七大参数解读

核心线程数

在这里插入图片描述

允许核心线程数超时allowCoreThreadTimeOut():

在这里插入图片描述
值默认是false, 永远都在池中不会被销毁
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果想让核心线程数在没有任务的时候也把他销毁:
设置为true:
在这里插入图片描述
这时候这个方法没有返回值,无法打印:
在这里插入图片描述

需要提交任务之后,才有线程

当我们提交任务之后,线程池中才会创建一个线程
在这里插入图片描述

想创建后立马创建线程:

在这里插入图片描述

阻塞队列

先暂时理解下,后面详细讲
先理解一个容器,可以往里面放数据,从里面取数据。先做个粗略的理解。
在这里插入图片描述
设置容量为自定义,如下设置为5:
在这里插入图片描述

最大线程数

池中最多能有多少个线程
在这里插入图片描述
不停提交任务,核心线程数用完,继续提交就存到队列里,队列满了再提交,就会再启动线程,如下设置了10个,那么就可以再临时创建10-5(核心)=5个线程
在这里插入图片描述

空闲线程超时时间和时间单位

上面那个如果设置了,核心线程也会被清理。
不设置就是清理非核心线程。
在这里插入图片描述
单位:设置的
在这里插入图片描述

如下:
就是5个非核心线程如果是空闲状态,空闲了15s,那么这5个非核心线程就会被销毁。
在这里插入图片描述

线程工厂

在这里插入图片描述
如下:
在这里插入图片描述
看源码:
在这里插入图片描述
线程工厂是一个接口:
有一个抽象方法:
存一个runnable, 给他创建一个线程返回
在这里插入图片描述
接口默认在jdk并发包里有两个实现:还有一个子实现:
找包对的,其他都不是并发包下的
在这里插入图片描述
默认用这两个实现就可以了:
这里用的工具类里的方法获取:
在这里插入图片描述
点进去看源码:
他就是给我们创建了一个默认的线程工厂的实现:
在这里插入图片描述
使用获取子类的线程工厂:
在这里插入图片描述

default线程工厂实现

在这里插入图片描述
点进去:
实现了接口,覆盖了newThread方法:
在这里插入图片描述
源码解读:
597:线程池个数编号,原子类后面会将
598:线程组
599:线程的编号,也是原子类,初始值是1
600:线程的名字的前缀
构造方法:
把线程组进行一个初始化,给线程名字前缀初始化
在这里插入图片描述
创建线程:
new一个线程:
参数:线程组,runnable,线程名字前缀拼上编号,栈的大小

线程如果是守护线程,改成非守护线程
线程优先级如果不是5,把优先级改成5
返回new的这个线程。
在这里插入图片描述

子类线程工厂实现

在这里插入图片描述
继承了default,default里有的东西相当于继承过来了。
首先继承了构造方法,super一下,把default里构造方法东西继承过来。
然后自己做了一些判断
在这里插入图片描述
new线程时:
用了父类的,实现的时候做了一些安全的检查
在这里插入图片描述
所以这个线程工厂上面有一些说明:
和当前线程有一些相同权限的线程工厂
在这里插入图片描述

自定义线程工厂

在这里插入图片描述
使用:
在这里插入图片描述

拒绝策略

在这里插入图片描述
在这里插入图片描述

拒绝策略参数源码:

参数位置:
在这里插入图片描述
拒绝策略是一个接口:
参数:要执行的任务,线程池对象
在这里插入图片描述
默认的实现策略有四个:
在这里插入图片描述

策略一AbortPolicy

在这里插入图片描述

使用:
在这里插入图片描述
源码:
实现拒绝策略接口,覆盖方法,
方法里就是抛异常:信息在异常中打印一下
在这里插入图片描述
异常是运行时异常:
在这里插入图片描述
所以可以try catch, 如果看见这个异常就可以额外处理

运行下用例:
在这里插入图片描述
提交第四个已经抛异常了:
在这里插入图片描述
记录的信息:
把runnable和线程池的信息打印了一下:
在这里插入图片描述

策略二:

不抛异常,有风险也不知道
在这里插入图片描述
使用:
在这里插入图片描述
源码:
实现接口,覆盖方法,方法里是空的,啥事都不做,所以当你任务超过他容量,那么这个是什么都不干,丢弃掉
在这里插入图片描述
代码演示:
在这里插入图片描述
在这里插入图片描述
运行结果:
有一个线程没被执行,抛弃掉了
在这里插入图片描述

策略三

丢弃最老的那个任务,执行当前的任务。
这个策略其实也是给丢掉。所以用的也不多。通常业务不多允许数据丢掉。
在这里插入图片描述
使用:
在这里插入图片描述
也是提交四个任务,分析:
一个核心线程在执行,队列有两个,提交了四个:
在这里插入图片描述
提交四的时候,会把老的丢弃,老的任务是2,所以会把2丢弃。
在这里插入图片描述

运行结果:
在这里插入图片描述
源码:
实现接口,覆盖方法:
如果线程池没有关闭,首先从线程池里拿到他的任务队列,调用poll方法,相当于给队列里移除一个,是队列的头部那个。
老任务删除,再把新任务提交给线程池。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

策略四

就是线程池来执行任务,当线程池已经满了,就用调用线程执行,比如main方法的线程去执行。在这里插入图片描述
代码演示:
在这里插入图片描述
在这里插入图片描述
运行结果:
线程4是由main线程执行的:
在这里插入图片描述
策略源码:
实现接口,覆盖方法:
方法: e线程池有没有关闭,如果没有关闭,直接调runnable的run方法,直接执行这个方法相当于:没有走线程,通过main方法调用的, main方法直接调线程里的run方法。
在这里插入图片描述

自定义拒绝策略

同样实现接口,覆盖方法
在这里插入图片描述

应用场景

一些开源项目实现的拒绝策略

线程池核心工作原理

在这里插入图片描述

线程池底层源码分析


http://www.hkcw.cn/article/mpNAmNhXWD.shtml

相关文章

2006-2021年 中国社会状况综合调查CSS数据(含Excel、Stata格式)

2006-2021年 中国社会状况综合调查CSS数据(含Excel、Stata格式).ziphttps://download.csdn.net/download/2401_84585615/89784651 https://download.csdn.net/download/2401_84585615/89784651 2006至2021年,中国社会状况综合调查&#xff08…

ReLU的变体

在深度学习中,ReLU(Rectified Linear Unit)是最常用的激活函数之一,但其存在一些局限性(如死亡ReLU问题)。为解决这些问题,研究者们提出了多种变体。以下是常见的ReLU变体及其核心特点&#xff…

麦克风和电脑内播放声音实时识别转文字软件FunASR整合包V5下载

我基于FunASR制作的实时语音识别转文字软件当前更新到V5版本。软件可以实时识别麦克风声音和电脑内播放声音转为文字。 FunASR软件介绍 FunASR 是一款基础语音识别工具包和开源 SOTA 预训练模型,支持语音识别、语音活动检测、文本后处理等。 我使用FunASR制作了一…

Ollama 开放 局域网访问 外网访问 mac

目录 问题描述 搜索尝试 最终方案 问题描述 我们在本地安装Ollama模型后通过127.0.0.1:11434访问正常返回 但是无法通过局域网IP访问如: http://192.168.1.158:11434 搜索尝试 搜索发现需要添加环境变量 OLLAMA_HOST 才能开放外网访问 export OLLAMA_HOST0.0.…

让Windows“怀上”macOS,不要太漂亮

记得Windows 11刚发布时,很多人都说它“果味十足”,仿佛是在向macOS靠拢。虽然大家觉得Windows有点“没骨气”,但不得不承认,它的界面确实很美观。 今天给大家介绍两款软件,能让Windows拥有macOS的风格,看起…

Gradle配置指南:深入解析settings.gradle.kts(Kotlin DSL版)

文章目录 Gradle配置指南:深入解析settings.gradle.kts(Kotlin DSL版)settings.gradle.kts 基础配置选项单项目配置多项目配置 高级配置选项插件管理(Plugin Management)基础配置模板案例:Android项目标准配…

Android SDK安装与配置(小白教程)

目录 1、下载: 2、安装: 3、配置环境变量: 4、验证是否安装成功: Android SDK(软件开发工具包)是一套为开发者提供的全面工具和资源集合,涵盖不同版本平台、各类开发与调试工具、支持库等&a…

[wsl2]MacOS/Win局域网ssh连接wsl2:Ubuntu24.04 LTS

【wsl2】MacOS/Win局域网ssh连接wsl2:Ubuntu24.04 LTS 保证使用的是微软应用商店中下载的Ubuntu发行版本,本文在配置时发现若使用docker所基于的ubuntu系统配置会失败。遂采用默认的子发行版本。写在前面why wsl2?win11的好处 开始配置之前1.…

JAVA游戏打手俱乐部护航小程序+APP+公众号+h5 源码游戏陪玩小程序系统

一、系统概述 JAVA 游戏打手俱乐部护航陪玩系统是一款集小程序、APP、公众号和 H5 于一体的综合性游戏陪玩平台。该系统凭借丰富多样的功能,为游戏玩家和陪玩师傅搭建了便捷的沟通桥梁。其主要功能包括精准分类、优惠券管理、我的团队、师傅申请入驻、师傅端抢单机…

使用Mac下载MySQL修改密码第一篇_数据库

Mac下载MySQL MySQL官网链接MySQL​​​​​​ 当进入到官网后下滑到community社区,进行下载 然后选择community sever下载 这里就是要下载的界面,如果需要下载之前版本的话可以点击archives, 可能会因为这是外网原因,有时候下…

【Mac 从 0 到 1 保姆级配置教程 08】- 快速配置 Neovim、LazyVim 以及常用开发环境,如果之前有人这么写就好了

文章目录 2. 安装 Neovim3. 安装 LazyVim3.1. 安装依赖3.2. 安装 LazyVim3.3. 问题修复 4. 配置 LazyVim4.1. 基础知识4.2. 内置快捷键4.3. 自定义快捷键4.4. 配置主题4.5. 配置 C/C 环境4.6. 配置 JSON 和 Markdown 5. 最后6. 参考资料7. 系列教程 Mac 从 0 到 1 保姆级配置教…

Android SMS发送技术指南

本文还有配套的精品资源,点击获取 简介:本文详细介绍了在Android平台上如何使用编程接口(API)发送短信,包括 SmsManager 类的使用、调试技巧和设备兼容性处理。通过实例代码展示了如何实现文本消息的发送&#xf…

AndroidStudio创建Android虚拟机教程

前言 在 Android 开发的世界中,拥有一个可靠且灵活的测试环境是至关重要的。Android Studio 提供了虚拟设备(AVD)管理器,这是一个强大的工具,允许开发者创建自定义的虚拟设备来模拟不同的 Android 设备。通过 AVD&…

uniapp 小程序 web-view 打开H5页面传参以及调用postMessage回传参数

uniapp 小程序 web-view 打开H5页面传参以及调用postMessage回传参数 uniapp 运行微信小程序,在小程序内利用 web-view 打开H5页面进行数据流转的总结。 首先做点准备工作,官网明确的说了小程序是不支持本地的,那怎么进行调试呢,…

mac 下载nvm

先在终端查看是否安装brew brew -v显示版本,开始下一步,如果不显示版本,则需要先安装brew 安装brew 使用brew安装nvm 执行安装命令 brew install nvm配置环境变量 配置环境变量之前,先查看nvm下载的位置 brew list nvm这是…

Android的uid~package~pid的关系

UID : Linux 系统级用户标识,Android 中每个应用安装时分配唯一 UID(如 1000)。 Package: Android 应用包名(例如android),一个 UID 可关联多个 Package(共享 UID 场景如android:sharedUserI…

Rust 学习笔记:发布一个 crate 到 crates.io

Rust 学习笔记:发布一个 crate 到 crates.io Rust 学习笔记:发布一个 crate 到 crates.io提供有用的文档注释常用标题文档注释作为测试注释所包含的项目 使用 pub use 导出一个方便的公共 API设置 crates.io 账户添加 metadata 到一个新的 crate发布到 c…

大白话 Seata 分布式事务浅析,详解TCC模式

大家好,我是此林。 说到分布式事务,第一时间想到 Seata,它支持多种事务模型,比如:XA模式、AT模式、TCC模式、Saga模式(长事务)。 其中 TCC 模式是高性能分布式事务解决方案,适用于核心系统等对 性能有很高…

超标量处理器设计6-指令解码

1. 指令缓存 指令缓存本质上是一个FIFO, 它能够将指令按照程序中指定的顺序存储起来,这样指令在解码的时候,仍然可以按照程序中指定的顺序进行解码。指令缓存是超标量处理器中必须的部件,其原因有两个: 1. 每周期可以取指的个数大…

技嘉华硕微星主板BIOS开启TPM模块教程

目录 一. TPM模块安装 二. 在BIOS开启TPM功能 华硕主板(Intel平台) 华硕主板(AMD平台) 技嘉主板(Intel平台) 技嘉主板(AMD平台) 微星主板(Intel平台) …