进程是系统中正在运行的一个程序,程序一旦运行就是进程。数据结构
进程能够当作程序执行的一个实例。进程是系统资源分配的独立实体,每一个进程都拥有独立的地址空间。一个进程没法访问另外一个进程的变量和数据结构,若是想让一个进程访问另外一个进程的资源,须要使用进程间通讯,好比管道,文件,套接字等。多线程
一个进程能够拥有多个线程,每一个线程使用其所属进程的栈空间。线程与进程的一个主要区别是,统一进程内的一个主要区别是,同一进程内的多个线程会共享部分状态,多个线程能够读写同一块内存(一个进程没法直接访问另外一进程的内存)。并发
示例:任务管理器中可看,一个个应用都表明一个 进程异步
线程是操做系统进行运算调度的最小单位。this
进程在执行任何一个 操做或者响应,都是由线程去完成的,进程包含线程,线程必定属于进程,进程和线程之间是一对多的关系操作系统
一个进程里面有多个执行流并发执行。好比一我的既能够某一段时间内即看电视有吃东西,每一个动做相似于线程,在同一段时间内作不一样的事,而且还能够进行信息共享。线程
如下实现都基于C#进行实现。3d
UI界面展现:blog
计算耗时方法代码:进程
public void DoSomething(int n) { var threadId = Thread.CurrentThread.ManagedThreadId; Console.WriteLine($"button1_Click{n} ==》线程ID:{threadId} ==》当前时间:{DateTime.Now.ToLongTimeString()} start......"); var num = 0; for (int i = 0; i < 1_000_000_000; i++) { num += i; } Console.WriteLine($"button1_Click{n} ==》线程ID:{threadId} ==》当前时间:{DateTime.Now.ToLongTimeString()} end......"); }
同步方法代码:
//同步方法 private void button1_Click(object sender, EventArgs e) { for (int i = 0; i < 5; i++) { this.DoSomething(i);//执行耗时方法 } }
异步多线程方法代码:
//异步多线程方法 private void button2_Click(object sender, EventArgs e) { for (int i = 0; i < 5; i++) {
int k = i; var task=Task.Run(() => { this.DoSomething(k); });//执行耗时方法
} }
同步方法跟异步多线程方法执行后效果对比:
控制台数据结果:
CPU占用资源结果:
结果分析:
从执行结果来看,总结几点
1.同步比异步执行时间更长,同步只有一个线程参与计算(主线程),因为主线程参与计算,致使UI界面卡顿,计算完成后主线程闲置,UI界面不卡顿,
异步执行时间短,界面不卡顿,主线程闲置,启用五个线程参与计算,效率高,但占用CPU资源较多。
2.同步符合正常程序逻辑,有序执行,异步执行顺序是无序的,执行顺序是有CPU调度决定。
3.从执行时间来看,单线程执行时间为16582ms,启用五个线程执行时间为3460ms,以正常思惟来看,一个线程执行16582ms,五个线程执行应该是3316ms才对,并无起到五倍的效率。
缘由有两点:1.资源是有限的 2.线程调度会有损耗
同步单线程方式执行效率低,界面卡顿,用户体验性不太好,占用CPU资源少。
异步多线程方式执行效率高,界面不卡顿,用户体验性较好,占用CUP资源多。
有时候使用多线程并非越多越好,应酌情使用。