Java中线程的六种状态
线程的生命周期总共有以下六种状态
-
New(新创建)
-
Runnable(可运行的)
-
Blocked(阻塞的)
-
Waiting(等待)
-
Timed Waiting(计时等待)
-
Terminated(被终止)
任何线程任一时刻只会有一种状态
1.New
新建线程 new Thread() 就是New状态
2.Runnable
可运行的 调用线程start方法 有可能有两种状态 Ready 准备阶段,Running 运行阶段
3.Blocked
只有关键字synchronized 未获取到monitor锁的线程会进入到Blocked状态,
其他锁 AQS 会进入Waiting状态 获取到moitor锁会进入Runnable状态
4.Waiting
有以下情况会进入等待状态
-
当前线程调用无参object.wait() wait方法与synchronized锁一起使用,同样
notify() :随机唤醒线程。
notifyAll():后进先出唤醒线程。
也必须在synchronized代码块里执行。
wait被唤醒以后会进入Blocked状态(因为必须在synchronized代码里调用),获取锁会进入Runnable状态。
-
当前线程调用无参Thread.join()。
join()执行结束会进入Runnable状态
-
当前线程调用无参LockSupport.park()。
LockSupport.unpark() 会进入Runnable状态。
5.Timed Waiting
以下会进入计时等待
-
Thread.sleep(long time)
-
object.wait(long time)
-
LockSupport.parkUtil(long time) LockSupport.parkNancos(long time)
-
Thread.join(long time)
状态转换与Waiting情况相同。
6.Terminated
- 线程运行结束,正常结束。
- 线程抛出异常,被终止。