Thread,ThreadPool,Task
线程分为前台和后台。比如我们直接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的更多相关文章
- 从Thread,ThreadPool,Task, 到async await 的基本使用方法解读
记得很久以前的一个面试场景: 面试官:说说你对JavaScript闭包的理解吧? 我:嗯,平时都是前端工程师在写JS,我们一般只管写后端代码. 面试官:你是后端程序员啊,好吧,那问问你多线程编程的问题 ...
- 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 ...
- Thread,ThreadPool,Task, 到async await 的基本使用方法和理解
很久以前的一个面试场景: 面试官:说说你对JavaScript闭包的理解吧? 我:嗯,平时都是前端工程师在写JS,我们一般只管写后端代码. 面试官:你是后端程序员啊,好吧,那问问你多线程编程的问题吧. ...
- 异步多线程 Thread ThreadPool Task
一.线程 Thread ThreadPool 线程是Windows任务调度的最小单位,线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以 ...
- .net 多线程 Thread ThreadPool Task
先准备一个耗时方法 /// <summary>/// 耗时方法/// </summary>/// <param name="name">< ...
- 浅析C#中的Thread ThreadPool Task和async/await
.net 项目中不可避免地要与线程打交道,目的都是实现异步.并发.从最开始的new Thread()入门,到后来的Task.Run(),如今在使用async/await的时候却有很多疑问. 先来看一段 ...
- 异步和多线程,委托异步调用,Thread,ThreadPool,Task,Parallel,CancellationTokenSource
1 进程-线程-多线程,同步和异步2 异步使用和回调3 异步参数4 异步等待5 异步返回值 5 多线程的特点:不卡主线程.速度快.无序性7 thread:线程等待,回调,前台线程/后台线程, 8 th ...
- .NET多线程(Thread,ThreadPool,Task,Async与Await)
.NET多线程是什么? 进程与线程 进程是一种正在执行的程序. 线程是程序中的一个执行流. 多线程是指一个程序中可以同时运行多个不同的线程来执行不同的任务. .NET中的线程 Thread是创建和控制 ...
- C#中 Thread,Task,Async/Await,IAsyncResult 的那些事儿!
说起异步,Thread,Task,async/await,IAsyncResult 这些东西肯定是绕不开的,今天就来依次聊聊他们 1.线程(Thread) 多线程的意义在于一个应用程序中,有多个执行部 ...
随机推荐
- oralce的function处理考勤时间节点以及计算工作时间
例如: 上班时间为 8:30 到17:30,加班则到21:00:午休时间为1小时,(12:00-13:00): 晚间休息时间为半小时 (17:30-18:00),计算一批考勤数据的上班时间. 思路: ...
- std::remove_reference
[std::remove_reference] 用于移除类型的引用,返回原始类型. 1.可能的实现. 2.例子. #include <iostream> // std::cout #inc ...
- Mysql设置大小写敏感
1.linux下mysql安装完后是默认:区分表名的大小写,不区分列名的大小写: 2.用root帐号登录后,在/etc/my.cnf 中的[mysqld]后添加添加lower_case_table_n ...
- java PDF添加图层,支持多页图层添加
java PDF添加图层,支持多页图层添加 代码: import java.io.File; import java.io.FileOutputStream; import java.io.IOEx ...
- pyautogui 文档(五):截图及定位功能
截图函数 PyAutoGUI可以截取屏幕截图,将其保存到文件中,并在屏幕中查找图像.如果您有一个小图像,例如需要单击并希望在屏幕上找到它的按钮,这将非常有用.这些功能由PyScreeze模块提供,该模 ...
- java关于get/post请求
package com.study.test; import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu ...
- Spring常用注解总结(2)
@Autowired "自动填装",作用是为了消除代码JAVA代码里面的getter/setter与bean属性中的property. @Autowired默认按类型匹配的方式,在 ...
- django xadmin后台页面实现二级联动
思路 先找到控件id ,这样就可以监听change事件 然后把自己写的js加入xadmin中 添加url和view,接受ajax请求和发送数据 第一步:找到联动上下级的ID 在浏览器中通过F12查看 ...
- adduser与useradd的区别
问题:使用 useradd 创建用户,发现 /home 目录下没有自动创建关于用户的目录.所以做了一番调查研究 useradd是一个linux命令,但是它提供了很多参数在用户使用的时候根据自己的需要进 ...
- python入门day01
一.编程和编程语言 电脑的基本原理: #计算机通过高低电流表示二进制数的1和0,所以计算机识别的是电压的高低,准确地说是用电压表示的各种数据,即数字信号;其他的物理量必须通过传感器等设备转换成数字 ...