你還在說「協程是輕量級執行緒」嗎?Kotlin 官方已經不這麼定義了。
Kotlin 1.1 剛推出協程時,官方文件裡直接寫著:
"Coroutines are light-weight threads."
當時這樣宣傳完全合理。那幾年大家還在被 Thread、AsyncTask、RxJava Scheduler、callback hell 折磨,Kotlin 需要一個最容易傳播的比喻:
於是「輕量級執行緒」成了最廣為流傳的定義。
打開目前版本的 Kotlin Coroutines Basics 文件,你會發現措辭明顯變了:
舊文件(1.1 時期)新文件(目前)Coroutines are light-weight threads.A coroutine is an instance of a suspendable computation.強調:lightweight、thread強調:suspend、non-blocking、structured concurrency官方不再把協程定義為「執行緒的輕量版」,而是重新定義為:
一段可掛起的運算(suspendable computation)。
核心詞從 thread 變成了 suspend。
協程不是 OS Thread,不是 JVM Thread,不參與 CPU 排程。它的底層是 Continuation(延續)+ 狀態機,跟執行緒是完全不同的抽象層次。
很多人以為協程解決的是執行緒效能問題。實際上,協程的首要價值是讓非同步程式碼變得可讀,資源效率只是附帶的收益。
回呼地獄:

協程寫法:

程式碼從「跳來跳去」變回了「從上往下」。這才是協程最大的勝利。
Kotlin 編譯器會把 suspend 函數改寫成狀態機。
原始碼:

編譯後的偽程式碼(簡化版):

關鍵點:
suspend 的本質是保存當前執行狀態,然後 returnlabel 繼續執行所以有人說:
Coroutine is not a lightweight thread. Coroutine is a lightweight continuation.
協程真正便宜的不是「執行緒變輕了」,而是 continuation 本身就極輕——只需要保存幾個區域變數和一個狀態標記。

父協程取消 → 子協程全部取消。不會有「野生協程」洩漏。


suspend 關鍵字告訴呼叫端:「這個函數可能非同步掛起,但你可以像同步程式碼一樣呼叫它。」這是 Kotlin 最大的語言級價值。
完整的非同步資料流生態,已經遠超「輕量級執行緒」的範疇。
Kotlin 官方並沒有完全刪除「lightweight thread」這個說法,但已經不再把它作為核心定義。
因為協程的本質不是:
而是:
所以,更準確的理解應該是:
協程不是輕量級執行緒,而是一種語言級的可掛起並發模型。