協程(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方法又繼續執行。內存