线程分为前台和后台。比如我们直接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等等)

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

Thread,ThreadPool,Task的更多相关文章

  1. 从Thread,ThreadPool,Task, 到async await 的基本使用方法解读

    记得很久以前的一个面试场景: 面试官:说说你对JavaScript闭包的理解吧? 我:嗯,平时都是前端工程师在写JS,我们一般只管写后端代码. 面试官:你是后端程序员啊,好吧,那问问你多线程编程的问题 ...

  2. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  3. Thread,ThreadPool,Task, 到async await 的基本使用方法和理解

    很久以前的一个面试场景: 面试官:说说你对JavaScript闭包的理解吧? 我:嗯,平时都是前端工程师在写JS,我们一般只管写后端代码. 面试官:你是后端程序员啊,好吧,那问问你多线程编程的问题吧. ...

  4. 异步多线程 Thread ThreadPool Task

    一.线程 Thread ThreadPool 线程是Windows任务调度的最小单位,线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以 ...

  5. .net 多线程 Thread ThreadPool Task

    先准备一个耗时方法 /// <summary>/// 耗时方法/// </summary>/// <param name="name">< ...

  6. 浅析C#中的Thread ThreadPool Task和async/await

    .net 项目中不可避免地要与线程打交道,目的都是实现异步.并发.从最开始的new Thread()入门,到后来的Task.Run(),如今在使用async/await的时候却有很多疑问. 先来看一段 ...

  7. 异步和多线程,委托异步调用,Thread,ThreadPool,Task,Parallel,CancellationTokenSource

    1 进程-线程-多线程,同步和异步2 异步使用和回调3 异步参数4 异步等待5 异步返回值 5 多线程的特点:不卡主线程.速度快.无序性7 thread:线程等待,回调,前台线程/后台线程, 8 th ...

  8. .NET多线程(Thread,ThreadPool,Task,Async与Await)

    .NET多线程是什么? 进程与线程 进程是一种正在执行的程序. 线程是程序中的一个执行流. 多线程是指一个程序中可以同时运行多个不同的线程来执行不同的任务. .NET中的线程 Thread是创建和控制 ...

  9. C#中 Thread,Task,Async/Await,IAsyncResult 的那些事儿!

    说起异步,Thread,Task,async/await,IAsyncResult 这些东西肯定是绕不开的,今天就来依次聊聊他们 1.线程(Thread) 多线程的意义在于一个应用程序中,有多个执行部 ...

随机推荐

  1. thinkphp 5 _initialize 使用问题

    如果继承的是common的话.控制器的_initialize要先继承父类的_initialize parent::_initialize();

  2. jdbc访问pipelinedb

    建立Stream及视图 pipeline.execute("create stream caesar(name text,info json);") #创建stream,字段nam ...

  3. PhoenixFD插件流体模拟——UI布局【Gird】详解

    流体网格 本文主要讲解Grid折叠栏中的内容 主要内容 Overview 综述 Parameters 参数 General 普通参数 Example: Scene Scale Example: Gri ...

  4. python3 urllib 类

    urllib模块中的方法 1.urllib.urlopen(url[,data[,proxies]]) 打开一个url的方法,返回一个文件对象,然后可以进行类似文件对象的操作.本例试着打开google ...

  5. 初次见面,C++(的博客作业)

    懵懂无知.编程是什么?要是你在两个月前问我这个问题,你可能只会得到一个回答“天知道”.依稀记得在初中,上电脑课的老师曾经触及过编程的皮毛(那时候也没有编程的概念,听的似懂非懂),旁边一个同学却在十分熟 ...

  6. Style- DataTrigger例子(Text长度)

    Text长度小于7时,边框变为红色 <Window.Resources> <local:L2BConverter x:Key="cvtr"/> <St ...

  7. Selenium 汇总

  8. Java几种常用JSON库性能比较

    本篇通过JMH来测试一下Java中几种常见的JSON解析库的性能. 每次都在网上看到别人说什么某某库性能是如何如何的好,碾压其他的库.但是百闻不如一见,只有自己亲手测试过的才是最值得相信的. JSON ...

  9. WebSocket入门及示例

    前言 一直在想要不要写下这篇,因为网上关于websocket的介绍和使用的好文实在太多太多,例如有这篇和这篇. 但我不管了,写下来,这样我就不用在想使用的时候总是去翻写过的源码了. 先回答几个简单的问 ...

  10. docker--在centos镜像安装mysql

    一.安装centos镜像 1.拉取最新版本centos镜像(拉取centos7 则使用centos:7即可) docker pull centos:lasted 2.查看已有镜像 docker ima ...