线程分为前台和后台。比如我们直接new一个Thread这就是前台线程。

前台线程一定会执行。

比如我们创建2个线程:1号,2号,同时执行,假设1号是主线程,1执行完了,依旧会等待2执行完成,整个程序才会结束。

后台线程。

主线程执行完成以后,程序就结束了不会关心后台线程时候执行完毕。

这里说的后台线程主要用线程池(ThreadPool)来管理(这里的TheadPool是一个概念)。

ThreadPool和Task

这里的ThreadPool和Task都是微软实现的线程池的的封装的操作类。

.Net线程池第一代实现类ThreadPool

ThreadPool类实现方式是有一个全局的集合用来存放所有的待执行的线程。所有的CPU从这个队列面搭载待运行的线程来执行,因为用的是全局的队列,所有多核的情况下存在并发。

所以加了同步锁。而且这个集合采用的是先进先出的方式(队列)。

.Net线程池第二代实现类Task

Task类实现方式是在每一个核上创建自己的集合。任务来了就根据负载分配到各自集合里。但是集合这个采用的是先进后出的方式(栈).因为每个核只管自己的队列所有就少了同步锁的问题。这样就提高了执行效率。而且如果某一个核的队列里面暂时没有需要被执行的任务。还可以从其他的正在忙核的队列里把他的任务拿过来自己做。(个人觉得应该是从尾部拿,如果从头部拿的话就又有同步的问题了。所以这也是采用栈的好处)。

而Async 和 await

这2个关键字就是其实就是方便写异步操作的。

Async表示这是一个异步方法。这个一部方法直接调用的话就是交由后台线程池去管理。所以他返回的值是一个Task。

由于是线程池管理所以是后台线程。经常我们在同步调用Async的方法的时候就要加wait 关键字。否则我们主线程执行完了。后台线程有没有执行完,程序都结束了。

wait和await

wait是等待一个任务的结果,等到了再往下走。这里会堵塞当前线程,必须等到结果以后才往下走

await也是等待一个任务的结果,但是不堵塞当前线程。直到需要用到这个任务的结果了。才不得不等待。

所以await也只会出现在Async的方法中,因为只有异步的方法才存在这种情况。

但是要注意异步和多线程 这是2个不同概念。

因为即使是单线程也是可以异步的(比如javascript就是单线程,但是他也可以通过Ajax异步,Redis也是)。

所以虽然这里的Async方法叫异步方法而且一定是和多线程分不开的(因为他牵涉到task等等)

但要明白这里只是把异步和多线程联合在一起使用罢了。

最新文章

  1. 《Unix网络编程》卷一(简介TCP/IP、基础套接字编程)
  2. 【Java】一个小程序,计算它包含的代码所需的耗时
  3. Minimum Path Sum
  4. 进程,线程(thread)
  5. windows下删除服务的方法
  6. HTML5历史管理
  7. 7.编写Java应用程序。首先,定义一个Print类,它有一个方法void output(int x),如果x的值是1,在控制台打印出大写的英文字母表;如果x的值是2,在 控制台打印出小写的英文字母表。其次,再定义一个主类——TestClass,在主类 的main方法中创建Print类的对象,使用这个对象调用方法output ()来打印出大 小写英文字母表。
  8. 【PAT_Basic日记】1005. 继续(3n+1)猜想
  9. Peaceful Commission
  10. 分布式文件系统FastDFS详解
  11. 使用 HttpRequester 更方便的发起 HTTP 请求
  12. Qt5+MSVC2015编译器编译发布的Release程序运行崩溃,如何查找崩溃的原因??
  13. [物理学与PDEs]第4章习题1 反应力学方程组形式的化约 - 动量方程与未燃流体质量平衡方程
  14. js 模拟css3 动画
  15. Keras框架下使用CNN进行CIFAR-10的识别测试
  16. Kafka: Producer (0.10.0.0)
  17. bzoj 2118 墨墨的等式 - 图论最短路建模
  18. spark监控入门
  19. Dynamics CRM 2011 怎么根据记录的etc参数值找到实体英文名和根据etc参数值或英文名称找到其实体中文名称
  20. Java_得到GET和POST请求URL和参数列表

热门文章

  1. 网页html格式导出Excel.xls
  2. centos7安装 python3.6,且保留2.7版本
  3. Selenium+Java的TestNG测试报告优化
  4. WEB实现单元格合并
  5. 转:Jmeter分布式测试
  6. redis缓存与数据库一致性问题
  7. Android横竖屏切换生命周期变化
  8. python 代码求阶乘
  9. CentOS查询端口占用和清除端口占用的程序
  10. [二分答案][NOIP2015]跳石头