不阻塞线程

阻塞线程 = 线程被"钉死"在原地,干瞪眼等着,别的啥也干不了

不阻塞线程 = 线程标记一下"这事我记着,先去干别的",等条件满足了再回来继续


用餐厅服务员类比

假设一个服务员(线程)要服务两桌客人:

阻塞(Blocking)

服务员给A桌下单后,站在收银台前一动不动,盯着出餐口等菜做好。B桌客人喊破喉咙他也听不见,因为他人被"卡"在这了。

kotlin

复制代码
// 阻塞线程:线程干等着,啥也不干
fun fetchData(): String {
    val response = httpClient.execute(request)  // 线程卡在这里等网络响应
    // 网络没回来之前,这行代码下面的都执行不了
    return response.body
}

不阻塞 / 挂起(Non-blocking / Suspend)

服务员给A桌下单后,记在小本上,转身去给B桌点菜、给C桌加水。后厨喊"A桌好了",他再回来端菜。

kotlin

复制代码
// 挂起协程:线程被释放,可以去执行其他协程
suspend fun fetchData(): String {
    val response = httpClient.executeAsync(request).await()  // 协程挂起
    // 等待期间,线程去执行别的协程任务了
    return response.body
}

代码层面的区别

表格

阻塞线程 不阻塞线程(挂起)
线程状态 RUNNABLE 但卡在等待,CPU 空转或内核挂起 协程挂起,线程被释放去执行别的任务
资源占用 占着线程不干活 线程可以服务其他协程
代码写法 直接调用函数 需要 suspend + await
并发能力 1个线程只能做1件事 1个线程可以同时"跟进"上百个协程

一个更直观的对比

kotlin

复制代码
// ========== 阻塞线程 ==========
fun blockingWay() {
    val result1 = fetchFromNetwork()  // 耗时2秒,线程卡死2秒
    val result2 = fetchFromNetwork()  // 再卡2秒
    // 总共4秒,线程全程被占着
}

// ========== 不阻塞线程 ==========
suspend fun nonBlockingWay() = coroutineScope {
    val deferred1 = async { fetchFromNetworkAsync() }  // 启动,不等待
    val deferred2 = async { fetchFromNetworkAsync() }  // 立刻启动第二个
    
    val result1 = deferred1.await()  // 如果需要,这里挂起协程(不是线程)
    val result2 = deferred2.await()
    // 两个请求同时发,大约2秒完成,等待期间线程去干别的了
}

一句话总结

阻塞线程 是"人(线程)被活拴在一件事上,别的干不了";

不阻塞线程是"事(协程)被挂起来记着,人(线程)先去忙别的,回头再来"。

协程的 await 挂起的是协程 ,释放的是线程。这是它能用少量线程处理大量并发请求的根本原因。

相关推荐
拥小抱7 小时前
Compose 知识点
android
文章永久免费只为良心7 小时前
Web应用安全与防护_第三章_日志文件包含_从一道 CTFshow 题目讲透「日志投毒型 LFI → RCE」:原理、时序陷阱与全变种攻防手册
android·网络安全·渗透测试·漏洞危害·漏洞描述·日志投毒·红队指南
AIsoft_86897 小时前
学术讲座录音如何整理?录音APP可行吗
android·iphone
Goway_Hui9 小时前
【KMP for OpenHarmony】-- 在鸿蒙工程中使用 Apollo-Kotlin
华为·kotlin·harmonyos
Patrick在香港9 小时前
一个斜杠,把毫秒变成十几秒
android·数据库·python·性能优化·正则表达式·回溯·redos
海雅达手持终端PDA11 小时前
工业手持终端的“去手机化”演进:看海雅达如何以“同轴扫摄”终结工程妥协,重塑工业PDA新范式
android·物联网·智能手机·硬件工程·能源·制造·iot
释厄62311 小时前
AI 军备竞赛悖论——为 AI 卖游戏但 AI 需要游戏母场景
人工智能·游戏·kotlin
booboosui12 小时前
删掉一个住在本机的 agent:8 处要清,顺序不能反
android
hcgeng12 小时前
Android获取崩溃日志
android