实现的核心是利用 CFRunLoopObserver 跟踪 RunLoop 关键状态:
- 当 Observer 收到
kCFRunLoopBeforeTimers、kCFRunLoopBeforeSources、kCFRunLoopAfterWaiting时,把running置为 YES,并记录startTime时间戳。 - 当 Observer 收到
kCFRunLoopBeforeWaiting、kCFRunLoopExit时,把running置为 NO。 - 子监控线程持续读取
running状态与startTime,判断当前时间与startTime的差值是否超过阈值。 - 一旦
running长时间为 YES 且差值超阈值,即认定主线程被阻塞。
这种方式依赖 RunLoop 自身的事件循环节奏,能在主线程繁忙时立刻发现状态停滞,确保检测精度。




