目录
线程状态及其含义
Java线程主要有以下几种状态:
- 新建(New):线程对象已被创建,但还没有调用
start()
方法。- 可运行(Runnable):线程对象调用了
start()
方法,此时线程就绪并等待CPU时间片以便执行。- 阻塞(Blocked):线程因为某种原因放弃CPU使用权,暂时停止运行。在Java中,阻塞状态通常发生在线程尝试获取一个锁(synchronized block/方法),而该锁正被其他线程持有时。
- 等待(Waiting):线程因为调用
wait()
、join()
或LockSupport.park()
方法而进入等待状态,需要其他线程调用notify()
、notifyAll()
或LockSupport.unpark(Thread)
来唤醒。- 超时等待(Timed Waiting):线程因为调用了带有超时参数的
sleep(long millis)
、wait(long timeout)
、join(long millis)
、Lock.tryLock(long timeout)
等方法而进入超时等待状态。- 终止(Terminated):线程因为执行结束或因为某种原因提前终止(如
interrupt()
)而结束执行。
状态之间的切换条件
- 新建(New) -> 可运行(Runnable):当线程对象调用了
start()
方法时,线程从新建状态变为可运行状态。- 可运行(Runnable) -> 阻塞(Blocked):当线程试图获取一个已被其他线程持有的锁时,它将从可运行状态变为阻塞状态。
- 可运行 (Runnable)-> 等待(Waiting):当线程调用
wait()
方法时,它将从可运行状态变为等待状态。- 可运行(Runnable) -> 超时等待(Timed Waiting):当线程调用带有超时参数的方法(如
sleep(long)
)时,它将从可运行状态变为超时等待状态。- 阻塞 (Blocked)-> 可运行(Runnable):当线程获取到它等待的锁时,它将从阻塞状态变为可运行状态。
- 等待(Waiting) -> 可运行(Runnable):当线程被
notify()
或notifyAll()
唤醒时,它将从等待状态变为可运行状态。- 超时等待(Timed Waiting) -> 可运行(Runnable):当线程等待超时,或者被
notify()
或notifyAll()
唤醒时,它将从超时等待状态变为可运行状态。- 可运行/阻塞/等待/超时等待 -> 终止(Terminated):当线程执行完毕或因为异常退出时,它将变为终止状态。
完结~~