阻塞与非阻塞
阻塞与非阻塞
这是Android开发中处理耗时操作的关键概念。在IO操作(网络请求、文件读写、数据库访问)、多线程(线程同步)/多进程通信中频繁出现。
描述程序执行时等待操作完成的两种模式。区别是:操作未完成时,当前执行流是否会被挂起等待。
1、阻塞(模式)
(耗时)操作未完成前,当前线程/进程/执行流会被挂起(等待),无法执行其他任务,直到操作结束(返回结果(成功/失败)),才能继续执行后续代码。
通俗理解:「等事情做完了,再干别的」。
阻塞的本质是操作系统将当前线程从「运行队列」移到「等待队列」,不再分配 CPU 时间片,直到等待的事件(如 I/O 完成)发生。
2、非阻塞(模式)
操作发起后,无论是否完成,当前线程/进程/执行流都不会被挂起,(当前线程)可以立即继续执行其他任务。后续通过轮询、回调或者事件通知获取操作结果。(操作结果会通过轮询、回调、事件驱动或协程等方式通知调用方)
通俗理解:「先问一下成没成,没成先干别的,回头再看」。
非阻塞的本质是操作系统始终将线程保留在「运行队列」,CPU 持续调度,线程需要主动检查操作状态。//没太懂
在Android开发中的关键应用
Android对主线程(UI线程)有严格限制:主线程不能执行任何阻塞式耗时操作(如网络请求、大文件读写),否则会触发ANR。因此,Android开发中核心是:将阻塞操作移到子线程,主线程以非阻塞方式处理结果。
常见的非阻塞实现方式:
1、Handler+Thread:子线程执行阻塞操作,通过Handler向主线程发送消息(非阻塞回调)。
2、AsyncTask(已废弃):封装了线程池和Handler,异步执行阻塞操作,结果回调到主线程。
3、Coroutine(协程):Android推荐的非阻塞方案,通过suspend函数将阻塞操作挂起(而非阻塞线程),代码仍保持线性逻辑,避免回调地狱。

4、RxJava:基于事件流的非阻塞响应式编程,通过操作符处理异步结果,解决回调地狱。

浙公网安备 33010602011771号