线程的生命周期有新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态。如下图所示:
1、新建状态(New):
实现Thread类,继承Runnable接口或Callable接口
2、就绪状态(Ready):
调用线程的 start() 方法,不一定会立即执行,可能需要等待CPU分配时间片。
进入就绪状态的几种方式:
1、调用start()方法
2、调用了notify()或notifyAll()或unPark()
3、yield方法
4、JVM将本身线程切换到其他线程
3、运行状态(Runable):
Cpu分配时间片开始执行
4、阻塞状态(Blocked):
进入阻塞状态的几种方式:
1、sleep()方法
2、wait()方法
3、join()方法
4、IO阻塞,read write等
5、线程等待synchronized隐式锁的状态
等待状态(Waiting):
发生在调用以下几个方法时:
1、不带参数的Object.wait()
2、不带参数的Thread.join()
3、LockSupport.park()
超时等待(Timed-Waiting):
与wait状态不同在于不会一直等待,而是等待指定的时间,超时则继续运行
发生在调用以下几个方法时:
1、Thread sleep(long millis)
2、Object.wait(long timeout)
3、Thread.join(long timeout)
4、LockSupport.parkNanos()
5、LockSupport.parkUntil()
5、结束状态(End):
当线程运行完毕,也就是run()方法执行完成或异常退出的方式,即死亡
线程生命周期的详细图: