新建(New)
创建后尚未启动
运行(Runnable)
包含了操作系统线程状态中的Running和Ready
可能正在执行,也可能正在等待CPU时间片
阻塞(Blocked)
等待获取一个排他锁,如果其线程释放了锁就会结束此状态。
无限期等待(Waiting)
等待其他线程显式的唤醒,否则不会被分配CPU时间片。
进入方法 | 退出方法 |
---|---|
没有设置Timeout参数的Object.wait() 方法 | Object.notify() / Object.notifyAll() |
没有设置Timeout参数的Thread.join 方法 | 被调用的线程执行完毕 |
LockSupport.part() 方法 | LockSupport.unpark(Thread) |
期限等待(Timed Waiting)
无需等待其他线程显式地唤醒,在一定时间之后会被系统自动唤醒。
调用Thread.sleep() 方法使线程进入期限等待状态时,常常用“使一个线程睡眠”进行描述
调用Object.wait() 方法使线程进入期限等待或者无期限等待时,常常用“挂起一个线程”进行描述
睡眠和挂起是用来描述行为,而阻塞和等待用来描述状态。
阻塞和等待的区别在于,阻塞是被动的,它是在等待获取一个排它锁。而等待是主动的,通过调用Thread.sleep() 和 Object.wait() 进入。
进入方法 | 退出方法 |
---|---|
Thread.sleep() 方法 | 时间结束 |
设置了Timeout参数的Object.wait() 方法 | 时间结束 / Object.notify() / Obejct.notifyAll() |
设置了Timeout参数的Thread.join() 方法 | 时间结束 / 被调用的线程执行完毕 |
LockSupport.parkNanos() 方法 | LockSupport.unpark(Thread) |
LockSupport.parkUntil() 方法 | 时间结束 / LockSupport.unpark(Thread) |
结束(Terminated)
可以是线程结束任务之后自己结束,或者产生了异常而结束。
参考
深入理解Java虚拟机 383 ~ 389 页 [书籍]
Java并发编程的艺术 87 ~ 89 页 [书籍]
CS-Notes