以下是线程的各个状态:
- 主动和被动:
- 挂起:主动触发。通常是由于内存不足或者用户/系统的主动执行,用于等待外部的某个条件满足时再继续执行。挂起状态需要主动恢复;
- 睡眠:主动触发。通常由程序员主动设置,用于在特定的时间后自动恢复进程/线程的执行;
- 阻塞:被动触发。通常是因为进程/线程在等待某个事件(比如:等待响应)或资源而暂时无法继续执行。阻塞状态在资源得到满足后会自动恢复;
- 资源占用:
- 挂起:进程/线程移动到磁盘上,不占用 CPU,其他任务可以执行,不释放锁;
- 睡眠:进程/线程既占用内存资源,又占用 CPU,导致 CPU 的使用大幅度降低,不释放锁;
- 阻塞:进程/线程保留在内存中,不占用 CPU,其他任务可以执行,释放锁;
- 恢复时机:
- 挂起:挂起的进程/线程需要由挂起它的对象(用户、系统)在时机符合时将其主动激活;
- 睡眠:睡眠的进程/线程在睡眠时间截止后就会恢复;
- 阻塞:阻塞的的进程/线程在等待的资源得到满足自动恢复;
- 应用场景:
- 挂起:常常用于程序调试中的条件中断,或在多线程/多进程的环境下的并发操作中控制并发操作和资源分配;
- 睡眠:常用于实现延迟、轮询等功能;
- 阻塞:多用于网络编程、I/O 操作等需要等待外部事件或资源的场景中;
挂起和阻塞的本质在于:正在执行的进程/线程,因为某些原因主动/被动的释放 CPU,暂停执行。
睡眠:Thread.sleep(long),是 Thread 的静态方法,可以使当前线程睡眠,线程仍在内存中,即不会释放 CPU 也不会释放锁。