一. 背景

  在刚接触开发的头几年里,说实话,根本不考虑多线程的这个问题,貌似那时候脑子里也有没有多线程的这个概念,所有的业务都是一个线程来处理,不考虑性能问题,当然也没有考虑多线程操作一条记录存在的并发问题,后面随着处理的系统业务越来越复杂,多线程再也回避不了了,也就借此机会深入研究了一下.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的作用及各种适用场景和用法

   第十六节:

   第十七节:

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

  1. 17委托异步调用方法

    抽象出一个炒菜的类. 1: //炒菜 2: public class Cooking 3: { 4: public string Cook(string food1, string food2) 5: ...

  2. (二)线程--通过委托异步调用方法

    (一).描述   先运行个简单的线程示例,认识一下线程   通过委托调用方法,以及使用AsyncResult判断线程的状态 (二).代码 using System; using System.Thre ...

  3. 多线程—Thread类及线程三种创建方式及对比

    线程创建的3种方法: 1.继承Thread类并重写run方法 Thread类方法: Thread Thread.currentThread() :获得当前线程的引用.获得当前线程后对其进行操作. Th ...

  4. 多线程Thread类创建多线程

    package com.ajax; //多线程Thread类创建多线程 public class Example02 {public static void main(String[] args){n ...

  5. python的多线程threading_Python中多线程thread与threading的实现方法,pythonthreading

    Python中多线程thread与threading的实现方法,pythonthreading 学过Python的人应该都知道,Python是支持多线程的,并且是native的线程.本文主要是通过th ...

  6. 6-7 jmu-Java-07多线程-Thread (3分)

    6-7 jmu-Java-07多线程-Thread (3分) 编写MyThread类继承自Thread.创建MyThread类对象时可指定循环次数n. 功能:输出从0到n-1的整数. 并在最后使用Sy ...

  7. Python中多线程thread与threading的实现方法

    Python中多线程thread与threading的实现方法 这篇文章主要介绍了Python中多线程thread与threading的实现方法,很重要的应用,需要的朋友可以参考下 学过Python的 ...

  8. python queue threading_Python 多线程 -thread threading Queue- 简单学习

    Python 多线程 -thread threading Queue- 简单学习 在实际工作过程中,会出现需要并发的做一些事情,例如一台机器测到几千台机器的网络连通性,如果你单线程一台一台测的话,会花 ...

  9. Java多线程-Thread、Runnable、Executor

    线程分为五个阶段:创建.就绪.运行.阻塞.终止. 创建:新建一个线程对象,如Thread thd=new Thread(). 就绪:创建了线程对象后,调用了线程的start()方法(此时线程只是进入了 ...

最新文章

  1. metaq的简单封装dataChange解读
  2. 上海的超级计算机,亚洲第一超级计算机在上海投入运行
  3. 对象序列化与反序列化
  4. 一般关于大宗商品的供需关系相关的数据网址有哪些?
  5. 吸引子矩阵和鞍点矩阵可以用神经网络二分类吗?
  6. 孙学京:我的大学在编程,练琴,听摇滚乐和专业课中度过
  7. postgresql中装gis插件_PostgreSQL插件PostGIS安装
  8. android 字符串 时间格式化,Android 获取年月日时分秒 格式化指定时间字符串
  9. cordova开发日记04 常用插件与使用(更新2016-05-19)
  10. 介绍一份数据分析报告
  11. 文字处理技术:与布局相关的功能
  12. 千图/千库/我图网/觅元素,终身会员来了!设计师的福利日!视觉运营室
  13. 透明图片怎么发给别人_【篮球头像】|半透明篮球头像+灌篮高手+哪吒头像
  14. iOS人脸识别Demo
  15. 上海立信会计师事务所专场 — 纯前端表格技术应用研讨会
  16. Web大学生网页作业成品:基于html制作中国科技发展网站设计题材【航天之路7页】HTML+CSS+JavaScript
  17. Qt小项目之txt文本替换
  18. Autodesk Alias AutoStudio 2022.0.1 x64
  19. 潍坊学院计算机打破世界纪录,牛!2017 ASC世界大学生超级计算机总决赛 潍坊学院每秒31.7万亿次峰值计算刷新世界纪录...
  20. AMD将坚持x86架构,不会投身ARM架构怀抱

热门文章

  1. 本来中午打算应付下随便吃点,可是连盐都没有放的辣椒炒蛋实在是令人不快...
  2. 【大数据】Hadoop入门预告版
  3. APP安全环节缺失,手游运营商怎样应对APP破解困境
  4. .net Reflection(反射)- 二
  5. delphi下实现ribbon界面的方法(一)
  6. Delphi环境中编写调用DLL的方法和技巧
  7. [Leedcode][JAVA][第837题][新21点][动态规划][数学]
  8. Palindrome subsequence HDU - 4632 区间dp|记忆化搜索
  9. python u_对python 命令的-u参数详解
  10. java添加信息_java – 向异常添加信息