线程的状态
- 新建 New
- 可运行 Runnable(分为就绪状态Ready和运行中状态Running)
- 阻塞 Blocked
- 等待 Waiting
- 等待(时间)Timed Waiting
- 结束 Terminated
image
线程的生命周期
1. New
一个新的线程被创建,还没开始运行。
2. Runnable
一个线程准备就绪,随时可以运行的时候就进入了 Runnable 状态。
Runnable 状态可以是实际正在运行的线程,也可以是随时可以运行的线程。
多线程环境下,每个线程都会被分配一个固定长度的CPU计算时间,每个线程运行一会儿就会停止让其他线程运行,这样才能让每个线程公平的运行。这些等待CPU和正在运行的线程就处于 Runnable 状态。
3. Blocked
例如一个线程在等待 I/O 资源,或者它要访问的被保护代码已经被其他线程锁住了,那么它就在阻塞 Blocked 状态,这个线程所需的资源到位后就转入 Runnable 状态。
synconized关键字导致的阻塞,基于jvm 堆中的object header对象头实现
4. Waiting(无限期等待)
如果一个线程在等待其他线程的唤醒,那么它就处于 Waiting 状态。以下方法会让线程进入等待状态:
- Object.wait() object.notify
- Thread.join() 释放锁
- LockSupport.park() AQS原理会调用 不释放锁
- 其他阻塞 如NIO流阻塞
5. Timed Waiting(有期限等待)
无需等待被其他线程显示唤醒,在一定时间后有系统自动唤醒。
以下方法会让线程进入有限等待状态:
- Thread.sleep(sleeptime)
- Object.wait(timeout)
- Thread.join(timeout)
- LockSupport.parkNanos(timeout)
- LockSupport.parkUntil(timeout)
6. Terminated
一个线程正常执行完毕,或者意外失败,那么就结束了。
阻塞状态和等待状态的区别
- 阻塞状态是等锁
- 等待状态是等着被唤醒,或者等时间到
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。