线程行为
一般来说,线程可以被
- 挂起(Suspend): 外部让当前线程进入”非可执行“状态,停止 CPU 对其时间切片的分配
- 恢复(Resume): 重新激活已挂起线程的执行
- 中断(Interrupt): 直接让线程进入终止状态(结束线程运行,基本上抛出错误了,配合debugger的中断检查机制等一般
这个相当于结果 —— 比如出现资源竞态的时候,我们使用了锁等同步操作(因),导致的资源状态发生的变化.
阻塞与挂起
阻塞是线程自己因为某操作而导致线程处于无法运行的状态,比如在尝试获得一个正在被占用的锁、或者说是等待系统IO、网络数据等,直到锁被释放等,才会被唤醒,继续执行
而挂起是外部通当前线程进入“非可执行状态”,需要显式等待其他地方的唤醒信号,才会继续执行
不论是阻塞还是挂起,都会让当前线程从运行状态切换到其他状态从而引起上下文切换 —— 线程的上下文(寄存器、栈指针 IP)被内核保存起来,调度器将其从就绪队列中移除,直到被唤醒
睡眠
最简单的一种挂起与恢复的机制应该是 ——
当前线程主动告知系统接下来的一段时间内“不干活”,不占用cpu资源,等待睡眠时间到了再被唤醒继续干活(
使用场景
假设有一个自动 GC 的程序在运行,就可以设置成一段时间休眠,等待休眠结束之后重新运行 —— 一方面可以在休眠的时候减少 cpu 等资源的占用;另一方面 GC 确乎是也不太需要实时运行(
假设我们在获取一个网络资源, 结果拉取的时候出现错误,此时便可以将线程先暂时进入休眠,过段时候等休眠结束之后重新进行资源的拉取