异步,多线程

E神课程记录 2018-05-15

进程:一个程序在计算机上运行的时候,占用的全部计算资源,称之为进程
线程:任何操作的执行,都是线程完成的 最小的执行流
线程属于进程 一个进程可以有多个线程
多线程:多个线程同时运行(多个执行流并发执行)

同步:完成方法调用后,才进入下一行
异步:发起方法调用,但是不等待,直接进入下一行,这个方法会执行的

1 同步方法卡界面,主线程忙于计算;异步多线程方法不卡界面,主线程闲置了,子线程在计算
2 同步方法慢,只有一个线程计算;异步多线程方法快,因为多线程并发计算;

   但不是线性增长,资源换时间,资源是有限的;多线程调度管理也有损耗

加快相应速度可以用多线程;但是线程不是越多越好;
3 异步多线程是无序的
启动无序:线程是OS 申请看运气
执行无序:互不干扰 看CPU调度
结束无序:耗时不确定
使用多线程一定要注意:不要想当然的去控制顺序,不要延迟启动来控制顺序
这些无序都会受到服务器状态影响

回调/状态通知/循环等待 控制顺序

请二哈吃饭,诚心诚意,他说要忙一会,我就等着,一直等他忙完了,咱们一起去吃饭
请Doing吃饭,客气一下,他说要忙一会,那我就自己去吃饭了,你忙完了你自己去吃饭吧

Thread
委托:Action(没返回值) Func(有返回值的)

Aciton action = new Action(要调用方法);
action.Invoke();//同步执行
action.BeginInvoke();//异步执行


2018-05-17 Task
.net 1.0 1.1

Thread thread = new Thread(new ThreadStart(()=>{}));
thread.Start();

.net 2.0 线程池 管理线程,限制最大线程数量;享元模式 做好线程的重用

ThreadPool QueueUserWorkItem(new WaitCallback(o=>{}));

.net 3.0 Task 基于线程池的;提供了丰富的api

Task.Run(new Action(()=>{}));

.net 3.5 TaskFactory

TaskFactory taskFactory = Task.Factory;
List<Task> taskList = new List<Task>();
taskList.Add(taskFactory.StatNew(new Action(()=>this.Coding("Name1","Client")));
taskList.Add(taskFactory.StatNew(new Action(()=>this.Coding("Name2","WechaClient"))));
taskList.Add(taskFactory.StatNew(new Action(()=>this.Coding("Name3","DBA"))));
Task.WaitAll(taskList.ToArray()); //表示线程等待全部task的完成
Task.WaitAny(taskList.ToArray()); //任意一个完成之后
Action<Task[]> action = new Action<Task[]>(tArray=>Console.WriteLine("联调测试"));
taskFactory.ContinueWhenAll(taskList.ToArray(),action);//等着等着任意任务完成后,启动子线程完成
Action<Task> action1 = new Action<Task>(t=>Console.WriteLine("红包奖励"));
taskFactory.ContinueWhenAny(taskList.ToArray(),action1);//等着任意任务完成后,启动子线程完成  回调式 参数是执行完的那个线程

.net 4.0 Parallel 并行计算

Parallel.Invoke(new Action(()=>{}));

问:线程池跟多线程的区别
答:多线程是在程序里多个线程,线程池可以管理线程,限制最大线程数量;享元模式 做好线程的重用

问:有没有一个结束让其他线程结束(节省资源的方法) 线程取消
答:1.线程自己支持 设置一个状态做判断 2.没有开始的线程没有取消 CTS

问:TaskFactory的线程个数可以设置吗
答:不能直接设置 可以设置ThreadPool


本文由 布墨 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。
阅读:344

还不快抢沙发

添加新评论