线程的五大状态 1.创建 线程的创建(继承Thread类、实现Runnable接口、实现Callable接口) 2.就绪 调用start()方法 线程进入就绪状态但并不会立即执行 而是由CPU调度执行 3.运行 线程由CPU调度执行 4.阻塞 调用sleep()、wait()或同步锁定时 线程进入阻塞状态 阻塞事件解除后重新进入就绪状态等待CPU调度执行 5.死亡 线程中断或结束 线程一旦进入死亡状态就不能再次启动
五大状态在Java中的关键字:
创建 NEW:
线程实例被创建,但尚未被调用start()方法
就绪与运行 RUNNABLE(细分为READY与RUNNING)
线程获得锁后进入就绪状态,被CPU调度执行后进入运行状态
阻塞 BLOCKED WAITING TIMED_WAITING
BLOCKED:线程想要访问的资源的锁被其他线程获取,线程进入阻塞状态,等待获得锁的线程释放锁。线程获得被释放的锁后进入就绪状态
WAITING:线程被调用wait()方法,进入无限期等待,等待被其他线程唤醒
TIMED_WAITING:线程被调用sleep()方法,进入有限期等待,无需等待被其他线程唤醒,线程在到达设定睡眠时间后会自动醒来
值得注意的是:
1.wait()方法会释放锁,而sleep()方法不会释放锁
2.无论因何进入等待,被唤醒后均从中断处开始执行
3.若在if代码块处中断,重新开始执行时会直接跳出if代码块;若在while代码块处中断,重新开始执行时会再执行一次while代码块
死亡 TERMINATED
当线程执行完run()方法,或者主线程执行完main()方法时,线程终止。线程对象可能还存活着,但不久就会被回收。而且线程一旦终止就无法再次执行