线程安全案例 --- 线程池

news2025/4/13 7:38:20

小王学习录

  • 今日鸡汤
  • 什么是线程池
  • 为什么需要线程池
    • 1. 协程
    • 2. 线程池
    • 3. 什么是用户态和内核态
  • 使用线程池 --- java标准库
    • 1. 线程池的创建
    • 2. 工厂模式
    • 3. 线程池的使用
  • ThreadPollExecutor类
    • 构造方法
      • 1. corePoolSize, maximumPoolSize 线程
      • 2. long keepAliveTime, TimeUnit unit 时间
      • 3. BlockingQueue<Runable> workQueue 任务队列
      • 4. ThreadFactory threadfactory 创建线程
      • 5. RejectedExecutionHandler handler 拒绝策略
  • 实现线程池
  • 编外: Runnable介绍

今日鸡汤

爱人如养花, 最好的花匠是自己

什么是线程池

线程池是对线程进行管理和复用的机制. 在程序中创建一组线程, 当有任务需要执行时, 随机分配任务给空闲线程. 而不单独为一个任务创建线程, 这提高了线程的利用率, 减小了线程使用时创建和销毁的开销.
线程池的管理结构, 线程对象状态, 线程队列保存在java虚拟机的堆中, 包括了ThreadPollExecutor中的字段. 而线程执行时的线程状态, 栈信息保存在内存中.

为什么需要线程池

即使引入了相对来说轻量的线程, 但是随着对并发要求以及系统性能要求的提高, 实现一种比线程更轻量的并发问题解决方式显得尤为重要, 如今出现的方法有两种:协程线程池

1. 协程

协程(纤程): 在java标准库中暂时并没有支持协程. 当下热度较高的Go语言支持了协程, 这应该也是其发展至今的一条因素吧. 期待java大佬早日在标准库中实现协程.
在这里插入图片描述

2. 线程池

第二种方法就是引进线程池. 创建和销毁线程的操作是由操作系统实现的, 有了线程池, 要用到线程时可以直接从池中拿, 也没必要销毁线程, 不用时放回到线程中. 从池中取和放的操作用户通过代码就能实现, 不用通过内核. 这种通过程序员写代码来操作线程叫用户态.

3. 什么是用户态和内核态

在这里需要说一下用户态和内核态的区别:

  1. 内核态: 内核态的操作是由操作系统内核来完成的, 操作系统提供给程序api, 称作为系统调用, 程序通过系统调用来驱使内核进行一些操作. 系统调用中的代码与内核相关, 开发程序员无法对其进行操作.
  2. 用户态: 程序执行是由程序员写代码来控制的, 执行什么, 怎么执行都是由程序员来指定.
  3. 内核态相比于用户态, 其操作更不可控. 因为内核并不只是为一个应用程序服务, 要对多个应用程序服务, 程序通过系统调用来驱使内核进行一些操作时, 并不知道此时内核要去完成多少个任务, 也不知道自己排在第几位去执行. 相比之下, 从池中拿的这种用户态执行时更加干净利索.

使用线程池 — java标准库

1. 线程池的创建

java的标准库中是根据工厂模式来实现线程池的创建的, 看如下代码:

ExecutorService executorService = Executors.newFixedThreadPool(10);
//代码创建了一个线程池, 池里面有10个线程. 

创建的线程池中的线程默认都为前台线程
以上代码用一个类方法创建了一个对象, 构造对象被隐藏在了类方法中. 这种方法叫做工厂方法, 这个方法所属的类就是工厂类, 这样的代码使用了工厂模式. 下面对工厂模式进行简单介绍

2. 工厂模式

工厂模式也属于一种设计模式, 前面介绍过一种单例模式的设计模式, 今天来说一下工厂模式
工厂模式: 通俗的讲, 工厂模式就是用一个普通方法来代替构造方法

这种情况发生在方法重载不能用于完成当前功能. 比如:
要表示一个点的坐标, 可以有平面直角坐标系和极坐标系两种表示方法, 两种表示方式的x,y坐标都是doble类型, 参数类型, 数量和返回类型都一致, 无法使用方法重载. 此时使用两个类方法(普通方法名可以不一致, 有几种构造方法就用几个不同名的类方法)来表示两种表示方法, 在类方法中再做一些限制从而实现用平面直角坐标系和极坐标系两种方式来表示坐标.

3. 线程池的使用

线程池的使用到的是submit方法, 使用submit可以异步的向线程池中的任务队列提交任务(不必等待任务执行完毕), 从而让线程池中的空闲线程去调用提交的任务.

public class ThreadDome1 {
   
    public static void main(String[] args) {
   
        ExecutorService executorService = Executors.newFixedThreadPool(10);

        for(int i = 0; i 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1099424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

paddlenlp:社交网络中多模态虚假媒体内容核查(特征篇)

初赛之特征构造 写在前面一、安装paddleOCR二、代码部分三、模型优缺点四、写在最后 写在前面 通过前面两篇文章的介绍&#xff0c;我们可以大致的知道模型用到的特征分为四块&#xff1a;qCap&#xff0c;qImg&#xff0c;captions&#xff0c;imgs。根据这些特征&#xff0c…

第一章 C语言程序设计Pro

考点一 C语言特点&#xff0c;C程序基本构成 数据类型丰富运算符丰富是一种中级语言&#xff08;高级&#xff09; //包含了中级和高级的特性数据类型检查不严格 //int和char通用 对下标的越界不报错 2021.下列属于计算机中高级语言的是&#xff08;…

嵌入式基础——哈弗结构

文章目录 1 什么是哈弗结构&#xff1f;2 哈弗结构单片机的特点3 什么是改进的(Enhanced)哈弗结构?4 写在最后 1 什么是哈弗结构&#xff1f; 哈佛结构是一种将程序指令存储和数据存储分开的存储器结构&#xff0c;如图所示&#xff1a; 哈佛结构是一种并行体系结构&#xf…

Consider using the `--user` option or check the permissions.

ERROR: Could not install packages due to an OSError: [WinError 5] 拒绝访问。: C:\\Users\\luckyli\\anaconda3\\envs\\CV\\Lib\\site-packages\\~orch\\lib\\asmjit.dll Consider using the --user option or check the permissions. 安装pytorch时遇到上述问题 通过以下…

Git Cherry Pick的使用

cherry-pick命令的基本用法 cherry-pick命令的基本语法如下&#xff1a; git cherry-pick <commit>其中&#xff0c;<commit>是要应用的提交的哈希值或分支名。该命令会将指定的提交应用到当前分支上&#xff0c;并创建一个新的提交。 使用场景 cherry-pick命令…

Jmeter-实现图片的上传和下载

图片上传 选中测试计划右键&#xff0c;添加->线程(用户)->线程组 配置线程组 上面分别是总次数&#xff0c;时间&#xff0c;循环次数&#xff0c;就是字面意思 选中你的线程组右键&#xff0c;添加->取样器->HTTP请求 配置HTTP请求 为了方便观看&#xff0c;这…

【C++基础】13. 结构体

文章目录 【 1. 结构体的定义 】【 2. 结构体成员的访问 】【 3. 结构体变量的声明 】【 4. 指向结构体的指针 】 数组与结构体&#xff1a;C/C 数组允许定义可存储相同类型数据项的变量。而结构体是 C 中另一种用户自定义的可用的数据类型&#xff0c;它允许我们存储不同类型的…

在vscode中配置git bash终端、git 源码管理

打开vscode文件->首选项->设置&#xff0c;打开设置搜索shell windows将以下配置添加到vscode中的settings.json中 注意&#xff1a; terminal.integrated.profiles.windows这个配置项是就是添加终端的terminal.integrated.defaultProfile.windows这个是配置默认选项的…

【Linux初阶】多线程3 | 线程同步,生产消费者模型(普通版、BlockingQueue版)

文章目录 ☀️一、线程同步&#x1f33b;1.条件变量&#x1f33b;2.同步概念与竞态条件&#x1f33b;3.条件变量函数&#x1f33b;4.条件变量使用规范&#x1f33b;5.代码案例 ☀️二、生产者消费者模型&#x1f33b;1.为何要使用生产者消费者模型&#x1f33b;2.生产者消费者模…

代理正向 反向代理

1.正向代理 主动发送流量 端口转发 反向代理 被动发送流量 正向代理的设置 画图 实验 利用 攻击机 外网 失控服务器 内网 外网都有 内部服务内网 使用工具 使用的恶意脚本 放到网页里 客户端 使用 网站访问 解析 一下 使用的工具 pyth…

Java学习_day01_hello java

构成 JDK JDK是java开发者工具&#xff0c;由JRE和一些开发工具组成。JRE JRE是java运行环境&#xff0c;由JVM和java核心类库组成。JVM JVM是java虚拟机&#xff0c;主要用来运行字节码。 执行过程 由IDE或文本编辑器&#xff0c;编写源代码&#xff0c;并将文件保存为*.ja…

谈谈 AOF

谈谈 AOF Append Only File&#xff0c;只追加文件。 AOF 文件存储的是具体的操作命令。 Redis 每执行一条写操作命令&#xff0c;执行完之后&#xff0c;就把该命令追加到 AOF_Buffer 缓冲区中&#xff0c;然后会使用某种写回策略&#xff0c;写回磁盘的AOF文件中。 Redis 重启…

【GD32】GD32F303串口设置DMA发生中断无法进入中断函数

在GD32F303官方提供的串口例程中&#xff0c;有一个DMA发生和接收中断例程&#xff0c;在模仿着写的过程中&#xff0c;能够正常发送数据&#xff0c;但是无法进入中断函数。DMA0_Channel3_IRQHandler函数时官方定义的弱函数&#xff0c;需要自己重新实现。如果开启了DMA0通道3…

ESP32单片机环境搭建(VScode + PlatformIO IDE)

一、环境搭建&#xff08;VScode PlatformIO IDE&#xff09; 1、官网下载VScode; 2、安装最新的插件&#xff08;C/C、PlatformIO IDE、python、Chinese&#xff09;&#xff1b; 3、在PlatformIO IDE中新建工程&#xff1a;Platforms——Projects——Create New Project——…

微信小程序-3

一、交互 API - - - 界面 - - - 交互 功能&#xff1a;提示 是否删除 1.wx.showToast 显示消息提示框 <button type"primary" bindtapclickBtn>按钮</button> <input style"margin: 20rpx;height: 60rpx;background: gainsboro;" type&…

百度文心一言 VS GPT

更多精华&#xff1a;即兴小索奇 | Link3 相信大家都关注AI&#xff0c;AI大模型已成为了科技领域的新焦点&#xff0c;各大科技巨头都争相推出自家的版本。其中&#xff0c;尤为引人注目的是中国科技巨头百度所推出的文心大模型。然而&#xff0c;即使在这激烈的竞争中&#x…

【数据结构与算法】字符串匹配,BF算法和KMP算法,next数组求法

朴素的模式匹配算法 bf算法 假设在主串S"helloworld"中找T"hellr"这个子串的位置 实现的思路如下 第一轮&#xff1a;子串中的第一个字符和主串中的第一个字符进行比较 如果相等&#xff0c;继续比较主串和子串中的第二个字符如果不相等&#xff0c;进行…

解决vue3 + vite + ts 中require失效的问题(require is not defind)

require is not defind因为require是属于webpack的方法&#xff0c;vite中找不到这个方法肯定报错 解决办法 通过vite官网了解到新的引入方式&#xff0c;我使用了其中一种 imgList: [{name: "lj",src: new URL(../../assets/img/applyList.png, import.meta.url).…

大数据 DataX 数据同步数据分析入门

目录 一、DataX 概览 1.1 DataX 是什么 1.2 DataX 3.0 概览 设计理念 当前使用现状 二、DataX 详解 2.1 DataX 3.0 框架设计 2.2 DataX 3.0 插件体系 2.3 DataX 3.0 核心架构 2.3.1 核心模块介绍 2.3.2 DataX 调度流程 2.4 DataX 3.0 的六大核心优势 2.4.1 可靠的…

为Mkdocs添加在线聊天(Tidio为例)

以Tidio为例,Tidio免费版已经完全够用且无需梯子 访问Tidio官网 要在您的网站上使用 javascript 代码方法安装 Tidio&#xff0c;您需要创建一个 Tidio 帐户。要创建 Tidio 帐户&#xff0c;请访问我们的网站<www.tidio.com>&#xff0c;然后单击 “开始” 按钮创建新的…