那些年我们一起追逐的多线程(Thread、ThreadPool、委托异步调用、Task/TaskFactory、Parallerl、async和await)

一. 背景

   在刚接触开发的头几年里,说实话,根本不考虑多线程的这个问题,貌似那时候脑子里也有没有多线程的这个概念,所有的业务都是一个线程来处理,不考虑性能问题,当然也没有考虑多线程操作一条记录存在的并发问题,后面随着处理的系统业务越来越复杂,多线程再也回避不了了,也就借此机会深入研究了一下.Net中的多线程的处理方案。

  发现在.Net领域中,多线程的处理大致经历了这么几个阶段:Thread→ThreadPool→委托的异步调用→Task→TaskFactory→Parallerl→异步编程模型(async和await)。

  关注我博客的人会发现,早在2017年6月份的时候,就开始整理多线程问题了,大约用了6篇文章的来介绍了.Net中的线程的使用方法,主要是介绍相应类的实例方法的使用,有点帮助文档的意思了哦,最近多线程使用的相当频繁,借此机会重新结合一些实际业务系统介绍一下.Net领域的多线程问题,本次将整合原先的六篇文章(删除或覆盖更新)。

本质:  充分发掘CPU的性能,把一些并没有先后强依赖关系、且耗时代码块放到一个新的线程里去处理,那么原先按顺序执行的业务就会变成并行执行,让主线程继续往后执行,节约了时间了,提高了效率。

下面补充一下多线程在时间和空间上的开销:

(一). 时间上:

①:开启或销毁一个线程都会通知进出中的dll程序集,让这些dll进行相应的操作。

②:时间片切换:4个逻辑处理器(不考虑Inter的超线程技术,一核对多个线程),同时并行只能处理4个线程,多余的休眠,很多时候,我们看似很多线程在并行执行,实际上是间歇性的串行。

《关于这个说法有异议的话,请留下您的见解,欢迎讨论,请勿谩骂》

(二). 空间上:

①:用户模式堆栈,一个线程分配1M的堆栈空间。

②:内核模式的堆栈,用户模式的参数需要传递到内核模式。

③:线程的内核数据结构,会存放一下变量。

 

二. 概念的梳理

 1. 进程、线程和多线程

  进程:当一个程序开始运行时,它就是一个进程(或者多个,eg:游戏),进程包括运行中的程序和程序所使用到的内存和系统资源,而一个进程又是由多个线程组成。

  线程:线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。

  多线程:多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

2. 多线程的好处和弊端

  好处:可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。(牺牲空间资源,来换取时间)

  弊端:

  ①:线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;(占内存多)

  ②:多线程需要协调和管理,所以需要CPU时间跟踪线程; (占cpu多)

  ③:线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;(多线程存在资源共享问题)

  ④:线程太多会导致控制太复杂,最终可能造成很多Bug。(管理麻烦,产生意外bug)

3. 何时建议使用多线程

  ①. 当主线程试图执行冗长的操作,但系统会卡界面,体验非常不好,这时候可以开辟一个新线程,来处理这项冗长的工作。

  ②. 当请求别的数据库服务器、业务服务器等,可以开辟一个新线程,让主线程继续干别的事。

  ③. 利用多线程拆分复杂运算,提高计算速度。

4. 何时不建议使用多线程

  当单线程能很好解决,就不要为了使用多线程而用多线程。

5. 同步调用和异步调用

  ①单线程同步调用:方法从上而下一次执行,一步一步执行,有先后顺序。

           

  ②异步调用(区别于异步方法):开启新的线程去执行业务,主线程单独执行,可以选择是否等待子线程执行完后再执行

    

同步方法 VS 异步方法: 

  1. 一个误区:异步方法指的是一些特有的方法(并不开启新线程),它和开启一个新的线程比如“很多情况下我们会说,开启一个新的线程去异步调用”,这不是一回事,典型的异步方法,比如js 的ajax请求。

  2. 同步方法:我们平时封装的一些普通方法大多数都是同步方法,同步方法典型的特点:就是在没有得到方法的返回值或者该方法没有执行完,该调用就需要在这等待,不能继续执行。

  3. 异步方法:异步方法在调用后,调用这在没有得到返回结果前,就可以继续执行后续业务,异步方法通常是通过通知、回调的方式告诉调用者,无须消耗过多的性能。

举例1:

  $.Post("url",{},function(data){     });

  $("#div1").html("");

这两行代码,第一行发送异步请求的时候,即使得到回调返回值,下面清空div1内容的操作同样也将执行,Post就是异步方法。

举例2:

  先封装1个方法: function  Add(a,b){  先休眠5s;   return a+b}

  调用:

  Add(1,2);

  $("#div1").html("");

这两行代码,Add方法就属于同步方法,所以必须等5s后,Add方法执行完,才能执行下面清空div1内容的操作。

  总结:同步方法和异步方法的区别就是:是否需要等待返回结果,才能执行后续操作。

  

6. 异步多线程的三个特点

  ①:同步方法卡界面,原因是主线程被占用;开启新线程去异步调用不卡界面,原因是计算交给了别的线程,主线程空闲.

  ②:同步方法慢,原因是只有一个线程计算;开启新线程去异步调用快,原因是多个线程同时计算,但是更消耗资源,不宜太多.

  ②:异步多线程是无序的,启动顺序不确定、执行时间不确定、结束时间不确定.

 

三. 系列章节

   第一节:复习委托,并且通过委托的异步调用开启一个新线程和异步回调、异步等待。

   第二节:深入剖析Thread的五大方法、数据槽、内存栅栏。

   第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能。

   第四节:Task的启动的四种方式以及Task、TaskFactory的线程等待和线程延续的解决方案。

   第五节:Task构造函数之TaskCreationOptions枚举处理父子线程之间的关系。

   第六节:深入研究Task实例方法ContinueWith的参数TaskContinuationOptions。

   第七节:利用CancellationTokenSource实现任务取消和利用CancellationToken类检测取消异常。

   第八节:Task的各类Task<TResult>返回值以及通用线程的异常处理方案。

   第九节:深究并行编程Parallel类中的三大方法 (For、ForEach、Invoke)和几大编程模型(SPM、APM、EAP、TAP)

   第十节:利用async和await简化异步编程模式的几种写法

   第十一节:深究用户模式锁的使用场景(异变结构、互锁、旋转锁)

   第十二节:深究内核模式锁的使用场景(自动事件锁、手动事件锁、信号量、互斥锁、读写锁、动态锁)

   第十三节:实际开发中使用最多的监视锁Monitor、lock语法糖的扩展、混合锁的使用(ManualResetEvent、SemaphoreSlim、ReaderWriterLockSlim)

   第十四节: 介绍四大并发集合类并结合单例模式下的队列来说明线程安全和非安全的场景及补充性能调优问题。

   第十五节:深入理解async和await的作用及各种适用场景和用法

   第十六节:

   第十七节:

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

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

相关文章

asp.net mvc webform和razor的page基类区别

接触过asp.net mvc的都知道&#xff0c;在传统的webform的模式下&#xff0c;page页面的基类是这样声明的&#xff1a; <% Page Language"C#" MasterPageFile"~/Views/Shared/Site.Master" Inherits"ViewPage" %> 如果是partial view的话…

frameset ajax,js控制frameSet示例

js控制frameSet示例1&#xff1a;js修改frameset的cols属性来达到修改各个页面所占的宽高&#xff0c;例如隐藏当前frame页。复制代码 代码如下:window.parent.document.getElementsByTagName("frameset")[0].cols"0,*";2&#xff1a;js调用其他frame页面的…

人生的抉择—aspx、ashx、asmx文件处理请求效率比较

总结&#xff1a; ashx&#xff1a;只是实现IHttpHandler接口 aspx&#xff1a;public class Page : TemplateControl, IHttpHandler 而TemplateControl是&#xff1a; abstract class TemplateControl : Control, INamingContainer, IFilterResolutionService 所以aspx是重型…

ajax jsp模糊查询源码,Ajax动态执行模糊查询功能

Ajax动态执行模糊查询功能 内容精选换一换Profiling采集的数据较多&#xff0c;同时解析后展示的性能指标项也比较多&#xff0c;为方便用户快捷查找到具体性能指标的含义&#xff0c;提供命令行查询功能&#xff1a;不包含metric_name参数时&#xff0c;打印hiprof.sh脚本帮助…

一般处理程序(ashx)和页面处理程序(aspx)的区别

客官请看图 图中的Httphandler就是处理程序。 两者的共同点 如果把aspx处理程序和ashx处理程序放到上图中&#xff0c;他们是处在相同的位置的&#xff0c; 他们都实现了IHttphandler接口。实现了IHttphandler才具备处理请求的能力 两者的不同点 微软对aspx下足了功夫&#…

怎么在微云服务器找一个文件,微云文件在哪里打开_怎么快速找到微云文件

微云文件在哪里打开&#xff0c;这个问题困扰了许多的朋友&#xff0c;今天小编带着教程走向大家&#xff0c;我们可以使用微云可以快速连接和预览在线文档&#xff1b;同时加载和卸载多终端、手机、计算机、同步PAD数据传输&#xff0c;无需数据线。对于微云客户端&#xff0c…

ASP.NET Core真实管道详解[1]

ASP.NET Core管道虽然在结构组成上显得非常简单&#xff0c;但是在具体实现上却涉及到太多的对象&#xff0c;所以我们在 《ASP.NET Core管道深度剖析[共4篇]》 中围绕着一个经过极度简化的模拟管道讲述了真实管道构建的方式以及处理HTTP请求的流程。在这个系列 中&#xff0c;…

Wayland 显示服务器,wayland 1.8.0 发布,显示服务器

Wayland 1.8.0 发布&#xff0c;该版本现已提供下载&#xff1a; wayland-1.8.0.tar.xz&#xff1a;该版本与 RC2 相比的变化&#xff1a;publish-doc: Add script for publishing docs to the websiteconfigure.ac: bump to version 1.8.0 for the official releasescanner: d…

华为把服务器虚拟底层锁了,华为全面关闭解码锁服务:马上升级到很吓人的技术!...

原标题&#xff1a;华为全面关闭解码锁服务&#xff1a;马上升级到很吓人的技术&#xff01;华为余承东被网友称之为余大嘴&#xff0c;华为P20 Pro发布之后&#xff0c;余大嘴豪言华为P20的销量将超过2000万部&#xff0c;很就会推出一项“很吓人的技术”&#xff0c;没想到仅…

ASP.NET Core真实管道详解[2]:Server是如何完成针对请求的监听、接收与响应的【上】

Server是ASP .NET Core管道的第一个节点&#xff0c;负责完整请求的监听和接收&#xff0c;最终对请求的响应同样也由它完成。Server是我们对所有实现了IServer接口的所有类型以及对应对象的统称&#xff0c;如下面的代码片段所示&#xff0c;这个接口具有一个只读属性Features…

pos机未能连接服务器,pos 机链接不了服务器

pos 机链接不了服务器 内容精选换一换在本章节中&#xff0c;您将运行已部署好的游戏&#xff0c;登录游戏客户端。已准备好Windows机器&#xff0c;硬盘至少20G&#xff0c;且必须安装有显卡。服务器地址&#xff1a;节点的弹性IP地址&#xff0c;请登录CCE控制台&#xff0c;…

ASP.NET Core管道深度剖析(1):采用管道处理HTTP请求

之所以称ASP.NET Core是一个Web开发平台&#xff0c;源于它具有一个极具扩展性的请求处理管道&#xff0c;我们可以通过这个管道的定制来满足各种场景下的HTTP处理需求。ASP. NET Core应用的很多特性&#xff0c;比如路由、认证、会话、缓存等&#xff0c;也同时定制消息处理管…

emui消息推送服务器,别再抱怨,这次或许真的轮到你了,EMUI9.1推送进度再次更新...

最近几年里&#xff0c;华为在系统方面下的功夫可谓是大家有目共睹的。以往大家在使用华为EMUI操作系统的时候&#xff0c;或许会感觉到卡顿、应用启动时间过长、运行不流畅以及UI界面毫无亮点可言等&#xff0c;但那已经是过去的EMUI系统了&#xff0c;今日的EMUI系统已与往日…

ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程

从《ASP.NET Core管道深度剖析&#xff08;1&#xff09;&#xff1a;采用管道处理HTTP请求》我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成&#xff0c;所以从总体设计来讲是非常简单的&#xff0c;但是就具体的实现来说&#xff0c;由于其中涉及很多对…

ASP.NET Core管道深度剖析(3):管道是如何处理HTTP请求的?

我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成&#xff0c;所以从总体设计来讲是非常简单的&#xff0c;但是就具体的实现来说&#xff0c;由于其中涉及很多对象的交互&#xff0c;我想很少人能够地把它弄清楚。为了让读者朋友们能够更加容易地理解管道…

ASP.NET Core管道深度剖析(4):管道是如何建立起来的?

在《管道是如何处理HTTP请求的&#xff1f;》中&#xff0c;我们对ASP.NET Core的请求处理管道的构成以及它对请求的处理流程进行了详细介绍&#xff0c;接下来我们需要了解的是这样一个管道是如何被构建起来的。这样一个管道由一个服务器和一个HttpApplication构成&#xff0c…

ASP.NET MVC 入门1、简介

什么是MVC模式 MVC&#xff08;Model-View-Controller&#xff0c;模型—视图—控制器模式&#xff09;用于表示一种软件架构模式。它把软件系统分为三个基本部分&#xff1a;模型&#xff08;Model&#xff09;&#xff0c;视图&#xff08;View&#xff09;和控制器&#xf…

ASP.NET MVC 入门2、项目的目录结构与核心的DLL

我们新建一个ASP.NET MVC的Web Application后&#xff0c;默认的情况下&#xff0c;项目的目录结构如下&#xff1a; App_Data &#xff1a;这个目录跟我们一般的ASP.NET website是一样的&#xff0c;用于存放数据。Content &#xff1a;这个目录是建议用来存放一下资源文件的。…

Maven超详细配置

&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是超梦梦梦梦&#xff0c;很高兴认识大家~&#x1f357;关注➕点赞➕评论➕收藏 &#x1f604;&#x1f64f;博主水平有限&#xff0c;如有错误&#xff0c;欢迎各位大佬纠正&#xff01; 目录&#x1f…

ASP.NET MVC 入门3、Routing

本系列文章基于Microsoft ASP.NET MVC Beta. 在一个route中&#xff0c;通过在大括号中放一个占位符来定义( { and } )。当解析URL的时候&#xff0c;符号"/"和"."被作为一个定义符来解析&#xff0c;而定义符之间的值则匹配到占位符中。route定义中不在大…