头图

在java的API文档里,Thread类有一个内部类State,描述了线程的六个状态。见下图。
image.png
首先讲一下三个最基本的状态:就绪态、运行态、终止态。


NEW:就绪态
new Thread();或者
new Thread子类();
这两行代码执行后,线程就处于就绪态,此时线程没有开启。


RUNNABLE:可运行
线程调用start()方法可以进入到可运行状态。
可运行状态就是线程可以在java虚拟机中运行的状态。此时他可能正在运行,也有可能正在等待因为cpu要不停地切换执行线程。注意这两种状态都是可运行状态。


Teminated(被终止)
因为线程的run方法正常执行结束或者被调用了stop方法被终止,这个时候就是被终止状态。


接下来是另外三个状态
Blocked(锁阻塞)
在线程处于可运行状态的时候,他可能会尝试获取锁。
如果他没有获取到锁,那么这个进程就处于阻塞态。
如果获取到了锁,就转成了可运行态。


Waiting(无限等待)
线程调用wait()方法,此时从运行态变成了无限等待。
进入此状态后,线程一直等待被其他线程唤醒,也就是等待其他线程获取此对象的锁,执行notify()
如果唤醒者线程获取此线程的锁成功执行了notify(),这个线程就被唤醒,进入到可运行。
如果唤醒者线程没有成功成功获取锁,可运行状态进入到阻塞态。(尝试获取锁)


Timed Waiting(计时等待)
和无线等待类似,这里指定了等待时间,在这个时间内一直等待被唤醒。常见的Thread.sleep方法和wait(long time)方法。
可运行态调用Thread.sleep方法或wait(long time)方法进入此状态。
等待时间内,获取到了锁,被唤醒进入可运行状态。
等待时间到,获取到了锁,被唤醒进入可运行状态。
等待时间结束,没有获取到锁,进入阻塞态。


最后放上一张图,(图片来源:刘乃源老师上课画的)
image.png


气突苏
1 声望0 粉丝