协程(Coroutine
)又称为微线程,咱们知道线程是CPU的执行的最小单位,线程执行的最小代码单位是方法。java
好比在执行的时候,一个线程从程序的入口调用Main方法,Main调用A方法,A方法又调用B方法,整个的执行完成的顺序是B->A->Main
。这个调用的顺序是明确的,是经过压栈和出栈的方式肯定的。安全
而协程不一样, Main调用B,在调用B的过程当中能够中断,Main函数继续执行一会,Main再中断,B继续再执行一会, 继续执行的代码是上次中断的地方。多线程
用伪代码表示两个方法:函数
funcA(){ funcB(); print 4; print 5; print 6; } funcB(){ print 1; print 2; print 3; }
若是是用正常的单线程线程来执行的时候,打印结果是123456
,若是采用协程,打印结果就有多是142536
.spa
协程的执行的结果有点和多线程相似,但本质与多线程不一样,线程有上下文切换,存在变量的拷贝,而协程只是轻量级的方法中断,因此切换效率是高于线程。线程
协程全部的变量都是共享内存,访问不须要加锁,使用时只需简单的判断,不存在线程不安全问题。code
在java中,还不支持协程的机制,因此用C#来演示下协程的过程。协程
static void Main(string[] args) { System.Console.WriteLine("执行方法:Main"); IEnumerable<int> intList = Xc.GetList(); foreach (int i in intList) { System.Console.WriteLine("协程1:执行"); Console.WriteLine("协程1:得到返回的结果是:" + i); } } class Xc { public static IEnumerable<int> GetList() { System.Console.WriteLine("执行方法:GetList"); for (int i = 0; i < 10; i++) { yield return i; System.Console.WriteLine("协程2: 执行"); System.Console.WriteLine("协程2:doSomething"); Thread.Sleep(1000); } } }
执行结果以下:blog
执行方法:Main 执行方法:GetList 协程1:执行 协程1:得到返回的结果是:0 协程2: 执行 协程2:doSomething 协程1:执行 协程1:得到返回的结果是:1 协程2: 执行 协程2:doSomething 协程1:执行 协程1:得到返回的结果是:2
从上面的结果能够看出,在协程1循环执行的时,Main方法会中断,执行GetList方法,执行GetList到达约定中断点,Main方法又继续执行。内存