Java 協程

協程是啥?

       我們都知道,線程是CPU調度的基本單位,但是到底設置多少個線程是很難決定的,並且如果一個線程陷入了IO等待的話,會降低整個系統的吞吐量。在Java中,每個線程對應JVM以及操作系統的一個輕量級線程。因爲stack的容量是有限的,所以不可能一直生成很多個線程。

       協程的本質上其實還是和上面的方法一樣,只不過他的核心點在於調度那塊由他來負責解決,遇到阻塞操作,立刻yield掉,並且記錄當前棧上的數據,阻塞完後立刻再找一個線程恢復棧並把阻塞的結果放到這個線程上去跑,這樣看上去好像跟寫同步代碼沒有任何差別,這整個流程可以稱爲coroutine,而跑在由coroutine負責調度的線程稱爲Fiber。也就是協程完全是在用戶態執行的

協程的好處是啥?

  1. 沒有線程切換的開銷,和多線程比,線程數量越多,協程的性能優勢就越明顯
  2. 不需要多線程的鎖機制,因爲只有一個線程,也不存在同時寫變量衝突,在協程中控制共享資源不加鎖,只需要判斷狀態就好了,所以執行效率比多線程高很多。

在Java中怎麼使用?

       通過定義Fiber,然後這個Fiber可以被Quasar調度,通過Java7中的fork-join框架。那Quasar是怎麼知道啥時候該暫停啥時候該恢復的呢?我們知道 JVM線程中斷的條件只有兩個,一個是拋異常,另外一個就是return。這裏Quasar就是通過拋異常的方式來達到的,拋出SuspendExecution,Quasar就知道去捕捉然後進行調度啦。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章