什麼是協程

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

相關文章
相關標籤/搜索