Kotlin 协程是一种轻量级的并发模型,用同步代码的写法实现异步逻辑,本质是基于挂起(suspend)和状态机,在不阻塞线程的情况下进行任务切换。
Kotlin 协程是一种基于挂起函数的轻量级并发方案,通过编译期状态机实现,在不阻塞线程的前提下进行任务调度,结合 Android 生命周期可以安全、高效地处理异步任务。

Q1:协程会不会阻塞线程?
不会,
suspend只是挂起协程,不会阻塞线程。
Q2:协程怎么取消?
通过
Job,并且协程是协作式取消,需要在挂起点检查。
Q3:协程和 RxJava 怎么选?
协程更适合顺序逻辑和生命周期管理,Rx 更适合复杂流式变换。
五、协程 vs 线程(必问)
| 对比项 | 线程 | 协程 |
|---|---|---|
| 创建成本 | 高 | 极低 |
| 切换成本 | 内核态 | 用户态 |
| 是否阻塞线程 | 会 | 不会 |
| 数量级 | 几百 | 几十万 |
| 生命周期管理 | 难 | 易 |
一句话总结:
线程是资源,协程是任务
fun main() = runBlocking {
println("main start thread=${Thread.currentThread().name}")
launch {
println("C1 start thread=${Thread.currentThread().name}")
delay(1000)
println("C1 after delay thread=${Thread.currentThread().name}")
}
launch {
println("C2 start thread=${Thread.currentThread().name}")
heavyWork() // 模拟耗时
println("C2 after heavyWork thread=${Thread.currentThread().name}")
}
println("main end")
}
suspend fun heavyWork() {
println("heavyWork start thread=${Thread.currentThread().name}")
Thread.sleep(2000)
println("heavyWork end thread=${Thread.currentThread().name}")
}
二、你先猜一下 Log 顺序(很重要)
先别往下看,你自己想一想:
delay(1000) 会不会挡住别的协程?
Thread.sleep(2000) 会不会?
三、真实打印顺序(标准答案)
text
复制代码
main start thread=main
main end
C1 start thread=main
C2 start thread=main
heavyWork start thread=main
heavyWork end thread=main
C2 after heavyWork thread=main
C1 after delay thread=main
这里Thread.sleep(2000)不会让出线程
✔ suspend ≠ 不执行
✔ delay ≠ 偷懒
✔ 协程 ≠ 消灭耗时
真正的分界线只有一条:
能不能在执行过程中"让出线程"
九、一句话面试必杀总结
你现在可以这样说(非常加分):
协程只能在挂起点让出线程,普通阻塞代码即使在协程里也会真实占用线程。
kotlin == ===
== 是比较值是否相等。相当于java里面的equel
=== 是比较是否为同一个对象而不仅仅是值是否相等,相当于java里面的==
kotlin 中的val和const以及 const val
val 是运行期常量,const val 是编译期常量,const 只能修饰 val,不能单独存在。
const x = 10 // ❌ 编译错误
const val TAG = "AppStoreActivity"
const val KEY_USER_ID = "user_id"
Java 中直接变成:
java
复制代码
public static final String TAG = "AppStoreActivity";
java和kotlin里面的?:
java里面?:是三目运算
int max = a > b ? a : b;
kotlin
表达式1 ?: 表达式2
含义:
如果 表达式1 != null → 返回它
如果 表达式1 == null → 返回表达式2
val name = user?.name ?: ""
等价 Java:
java
复制代码
String name = user != null ? user.getName() : "";
配合安全调用
kotlin
复制代码
val length = text?.length ?: 0
抛异常(Kotlin 惯用)
kotlin
复制代码
val user = intent.getParcelableExtra<User>("user")
?: throw IllegalArgumentException("user is null")