阻塞和非阻塞、同步和异步、挂起

张开发
2026/5/31 12:18:56 15 分钟阅读
阻塞和非阻塞、同步和异步、挂起
阻塞和非阻塞阻塞和非阻塞指的是线程在调用后线程是否干等。挂起的是任务阻塞的是线程任务在线程中处理线程可以处理不同的任务。即任务挂起、线程阻塞。阻塞的特征线程完全工作或干等在语句从调用开始到返回结果的整个过程。非阻塞的特征语句调用后线程不等待或不只等待结果线程还可以去执行其它任务。同步和异步按照指令执行顺序的特征程序执行分为同步执行和异步执行 这实际上也是程序所描述的逻辑的复杂性的体现。同步和异步指的是流程是否按书写顺序执行。同步的特征语句调用按从上到下的书写顺序逐行等待执行。同步有阻塞也有非阻塞。异步的特征语句调用后有回调流程。异步都是非阻塞。同步和异步是一组描述指令执行或者事件产生顺序的概念并发、并行描述的是多个多段可独立运行的程序对系统资源主要是CPU的占用它们是对程序在不同维度上的描述。异步也可能伴随着并发或者并行的发生。示例suspend fun blockingWork() { Thread.sleep(1000) // 线程阻塞 } suspend fun nonBlockingWork() { delay(1000) // 协程挂起线程非阻塞释放 }‌线程阻塞状态不占用CPU资源‌当Java线程进入阻塞状态Blocked State或等待状态Waiting State时它会主动释放CPU使用权进入挂起状态直到所等待的条件满足如I/O完成、锁可用、超时或被唤醒后才会重新进入就绪态Runnable等待调度器分配CPU时间片继续执行。关键结论‌阻塞状态下线程不消耗CPU时间片‌。‌操作系统调度器会将该线程移出运行队列转而调度其他就绪线程‌。‌常见阻塞场景包括‌Thread.sleep()线程休眠指定时间。Object.wait()等待通知。Thread.join()等待另一线程结束。I/O操作如InputStream.read()、ServerSocket.accept()等待数据或连接。注意事项虽然‌阻塞本身不占用CPU‌但以下情况可能导致‌CPU占用异常升高‌需区分‌大量线程频繁阻塞与唤醒‌引发频繁上下文切换增加调度开销。‌锁竞争激烈‌线程在Runnable与Blocked状态间高速切换造成“唤醒风暴”。‌死循环或计算密集型任务‌此时线程处于Running状态‌不是阻塞‌会持续占用CPU。

更多文章