【.NET Core】多线程之线程池(ThreadPool)详解(一)

【.NET Core】多线程之线程池(ThreadPool)详解(一)

文章目录

  • 【.NET Core】多线程之线程池(ThreadPool)详解(一)
    • 一、概述
    • 二、线程池的应用范围
    • 三、线程池特性
      • 3.1 线程池线程中的异常
      • 3.2 最大线程池线程数
      • 3.3 最小值线程池线程数
    • 四、线程池使用

在这里插入图片描述

一、概述

有些应用程序使用多个线程,创建的线程花费大量时间处于休眠状态,等待事件发生,其他线程可能进入睡眠状态,并且仅定期被唤醒以轮询更改或更新状态信息,然后再次进入休眠状态。为了简化对这些线程的管理,.NET框架为每一个进程提供了一个线程池,使应用程序能够根据需要来有效地利用对个线程。一个线程监视排到线程池的若干个等待操作的状态。让一个等待操作完成时,线程池中的一个辅助线程就会执行对应的回调函数。线程池中的线程由系统进行管理,程序员不需要费力于线程管理,可以几种精力处理应用程序任务。

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间之后创建另一个辅助线程。但线程的数目永远不会超过最大值。超过最大值的其他线程可以排队,但它们要等到其他线程完成后才启动。

二、线程池的应用范围

线程池特别适合于执行一些需要多个线程的任务。使用线程池能够优化这些任务的执行过程,从而提高吞吐量,它不仅能够使用系统针对此进程优化过程,而且还能够使系统针对计算机上的其他进程优化该执行过程。如果需要启动多个不同的任务,而不想分别设置没个线程的属性,则可以使用线程池。

线程池主要应用于以下几种情况:

  • 不需要前台执行的线程
  • 不需要在使用线程具有特定的优先级
  • 线程的执行时间不易过长,否则会使线程阻塞。由于线程池具有最大线程数限制,因此大量阻塞的线程池的线程可能会阻止任务启动。
  • 不需要将线程放入单线程单元。所有ThreadPool线程均不处于多线程单元中。
  • 不需要具有与线程关联的稳定标识,或使某一线程专用于某一任务。

.NET将线程池线程用于多种用途,包括任务并行库(TPL)操作、异步I/O完成、计时器回调、注册等待操、使用委托的异步方法调用和System.Net套接字连接。

三、线程池特性

线程池线程是后台线程。每个线程均使用默认的堆栈大小,以默认的优先级进行,并且位于多线程单元中。一旦线程池中的线程完成任务,它将返回到等待线程队列中。这时开始既可重用它。通过这种重复使用,应用程序可以避免生产为每个任务创建新线程的开销。

每个线程只有一个线程池。

3.1 线程池线程中的异常

线程池线程中未经处理的异常终止该进程。 以下为此规则的三种例外情况:

  • System.Threading.ThreadAbortException在线程池线程中引发,因为调用了Thread.Abort
  • Sytem.AppDomainUnloadedException在线程池线程中引发,因为正在卸载应用程序域。
  • 公共语言运行时或主机进程将终止该线程

3.2 最大线程池线程数

可以排队到线程池中的操作数仅受可用内存限制。但是,线程池会限制进程中可同时处于活动状态的线程数。如果所有线程池线程都处于忙碌状态,则其他工作项将进行排队,直到要执行它们的线程空闲。进程的线程池的默认大小取决于若干因素。可以通过以下两个方法控制线程池的大小:

  • ThreadPool.GetMaxThreads方法来获取线程池的最大线程数。
  • ThreadPool.SetMaxThreads方法来设置最大线程数。

3.3 最小值线程池线程数

线程池根据需要提供新的工作线程或 I/O 完成线程,直到它达到每个类别的指定最小值。 可以使用ThreadPool.GetMinThreads方法来获取这些最小值。

达到最小值时,线程池可以创建其他线程或等待,直到一些任务完成。 线程池创建和销毁工作线程以优化吞吐量,吞吐量被定义为每个单位时间完成的任务数。 线程过少可能无法实现可用资源的最优利用,而线程过多则可能增加资源争用。

四、线程池使用

  • 使用任务并行库(TPL)。默认情况下,TPL类型使用线程池线程来运行任务。

  • 通过从委托代码调用ThreadPool.QueueUserWorkItem并传递表示执行任务的方法的System.Threading.WaitCallback委托来使用线程池。

  • 使用线程池的另外一种方法ThreadPool.RegisterWaitForSingleObject方法并传递在发出信号或超时的时候调用System.Threading.WaitOrTimerCallback委托所表示的方法System,Threading.WaitHandle,从而对于等待操作相关的工作排队。线程池线程用于调用回调方法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

旅游项目day14

其他模块数据初始化 搜索实现 请求一样,但是参数不一样,根据type划分。 后台需要提供一个搜索接口。 请求分发器: 全部搜索 目的地搜索 精确搜索、无高亮展示 攻略搜索 全文搜索、高亮显示、分页 游记搜搜 用户搜索 丝袜哥

Python实现Lasso回归模型

• Tibshirani(1996)提出了Lasso(The Least Absolute Shrinkage and Selectionator operator)算法。 • 通过构造一个一阶惩罚函数获得一个精炼的模型;通过最终确定一些指标(变量)的系数为零(岭回归估计系数等于0的机会微乎其微&a…

Mysql--创建数据库(1)

我们可以在登陆 MySQL 服务后,使用 create 命令创建数据库,语法如下: CREATE DATABASE 数据库名;以下命令简单的演示了创建数据库的过程,数据名为 R OB: [roothost]# mysql -u root -p Enter password:****** # 登录后进入终端mysql>…

什么是美颜SDK:解密视频美颜SDK背后的图像处理算法

美颜SDK是一种集成到应用程序中的工具包,能够通过图像处理算法实时改善或修改用户的面部外观。在本文中,我们将深入探讨美颜SDK的基本概念,并解密其背后的图像处理算法。 一、美颜SDK的基本概念 美颜SDK的应用范围广泛,涵盖了视…

《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第1章 统计学习方法概论

文章目录 第1章 统计学习方法概论1.1 统计学习1.统计学习的特点2.统计学习的对象3.统计学习的目的4.统计学习的方法1.2.1 基本概念1.2.2 问题的形式化 1.3 统计学习三要素1.3.1 模型1.3.2 策略1.3.3 算法 1.4 模型评估与模型选择1…

助力焊接场景下自动化缺陷检测识别,基于YOLOv8【n/s/m/l/x】全系列参数模型开发构建工件表面焊接裂纹缺陷检测识别分析系统

焊接是一个不陌生但是对于开发来说相对小众的场景,在工件表面焊接场景下常常有对工件表面缺陷智能自动化检测识别的需求,工业AI结合落地是一个比较有潜力的场景,在我们前面的博文开发实践中也有一些相关的实践,感兴趣的话可以自行…

SpringBoot3.1.7集成Kafka和Kafka安装

一、背景 我们在很多系统开发都需要用到消息中间件,目前来说Kafka凭借其优秀的性能,使得它的使用率已经是名列前茅了,所以今天我们将它应用到我们的系统 二、版本选择 在使用一个中间件一定要考虑版本的兼容性,否则后面会遇到很…

搜索与图论第五期 拓扑序列

前言 拓扑排序是非常重要的一部分,希望大家都能够手撕代码!!!(嘿嘿嘿) 一、拓扑排序定义(百度须知嘿嘿嘿) 拓扑排序 拓扑排序是一种对有向无环图(Directed Acyclic Gra…

开始学习vue2基础篇(指令)

一、 内容渲染指令 > {{}} 模板渲染(模板引擎) 1. {{数据绑定}} 2. {{简单计算}} 3. {{简单逻辑运算}}(三元运算) 4. {{做简单 js 判断}} 注意:不能写语句、不能解析 html 渲染、不能放在在属性身上 > v-…

菜鸟导入导出assetbundle

因为菜鸟不会用unity c#什么的,所以最后参考贴吧的方法用的是UABE(Unity Assets Bundle Extractor)和UABEA(Unity Assets Bundle Extractor Avalonia) 可以去github上下载 对于txt、xml什么的可以直接改,但是byte文件里还是会有一些类似乱码的东西&…

算法通关村番外篇-面试150题一

大家好我是苏麟 , 今天开始LeetCode面试经典150题 . 大纲 26. 删除有序数组中的重复项80. 删除有序数组中的重复项 II 26. 删除有序数组中的重复项 描述 : 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 …

MIT - 线性代数-LU_LDU分解|单位矩阵

麻省理工学院 - MIT - 线性代数 第四讲 https://www.bilibili.com/video/BV1GD4y1x7Za/?spm_id_from333.1007.top_right_bar_window_history.content.click&vd_source54eff91a9ce326df74fd3b06c9fc2be322情况 老师,没讲明白的LU分解,MIT一张图就解…

【QT+QGIS跨平台编译】之五:【curl+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、curl介绍二、curl下载三、文件分析四、pro文件五、编译实践 一、curl介绍 curl(CommandLine Uniform Resource Locator)主要功能就是用不同的协议连接和沟通不同的服务器,相当封装了的socket。 libcurl支持http, https, ftp, g…

什么叫单位矩阵?

单位矩阵(Identity Matrix)是一个特殊的方阵,其主对角线上的元素全为1,而其他元素全为0。单位矩阵通常用符号 I 或 E 表示。 一个nn 的单位矩阵的表示形式如下: 其中,主对角线上的元素全为1,…

http网络编程——在ue5中实现文件传输功能

http网络编程在ue5中实现 需求:在unreal中实现下载功能,输入相关url网址,本地文件夹存入相应文件。 一、代码示例 1.Build.cs需要新增Http模块,样例如下。 PublicDependencyModuleNames.AddRange(new string[] { "Core&q…

matlab 交通流量PI和P控制

1、内容简介 略 37-可以交流、咨询、答疑 2、内容说明 略. 题目背景 有一条路,他有一个主干道和一个次干道,现在这条路上有一定的交通流,交通流的情况是第二张图(交通流的程序在那个matlab文件里的做出的figure1里有)&#x…

【vue3】GSAP在vue中的使用

一、获取GSAP npm install gsap 二、开始GSAP 导入GSAP,如果需要导入gsap的插件可以参考这里。 import gasp from gsap; 这里用的是选项式,在methods属性中创建一个方法用来写gsap的动画。 gasp_animation(){let tl gasp.timeline({defaults:{ ease:&…

win10 任务栏设置透明

先看效果图 第一步:按下“Win R”组合键,输入“regedit”并回车,打开注册表编辑器。 第二步:在注册表中找到路径“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced”。 第三步:在…

1 认识微服务

1.认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢? 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构:将业务的所有…

yolov5 opencv dnn部署 github代码

yolov5 opencv dnn部署 github代码 源码地址实现推理源码中作者的yolov5s.onnx推理条件python部署(因为python比较简单就直接介绍了)c部署 参考链接 源码地址 yolov5官网还提供的dnn、tensorrt推理链接本人使用的opencv c github代码,代码作者非本人,也是上面作者推…