本篇将详细讲述线程的所有状态,如果有想了解其他内容,请点击上面哦!!!
一、线程的状态
线程的状态是一个枚举类型Thread.State,一共有六种类型,分别是:
- NEW: 安排了工作, 还未开始行动
- RUNNABLE: 可工作的. 又可以分成正在工作中和即将开始工作.
- BLOCKED: 这几个都表示排队等着其他事情,表示等待获取锁
- WAITING: 这几个都表示排队等着其他事情,线程在无限等待唤醒
- TIMED_WAITING: 这几个都表示排队等着其他事情,线程在等待唤醒,但设置了时限
- TERMINATED: 工作完成了
public class ThreadDemo { public static void main(String[] args) { for (Thread.State state: Thread.State.values()) { System.out.println(state); } } }
下面来详细讲述一下:
1.什么是NEW状态?
当线程对象创建后,就是进入了新建状态:
2.什么是RUNNABLE状态?
当线程对象调用start()方法,线程就是进入了就绪状态。在就绪状态中,可分为正在工作和即将开始工作,并不是执行了start()此线程立即就会执行。
3.什么是Blocked状态?
阻塞状态是线程因为某种原因放弃CPU的使用权,暂停或停止运行,直到线程进入就绪状态,才有机会获得到CPU的注意,再次转入运行状态。
其中阻塞又分为三种情况:
1.等待阻塞:
运行的线程执行wait方法,则该线程会释放占用的所有资源,进入这个状态后是不能被自动唤醒的,需要调用notify/notifyAll 方法才能被唤醒。
2.同步阻塞:
运行的线程在获取对象的同步锁(synchronized)时,若该对象同步锁被其他线程占用了,则该线程会进入阻塞状态。
3.其他阻塞:
运行的线程执行sleep/join方法,或者发出了I/O请求时,线程会变为阻塞状态。当sleep方法等待超时、join方法等待线程终止或者超时、I/O处理完毕时,线程将重新转入就绪状态。
4.什么是RUNNING状态?
就绪状态的线程获取到了CPU使用权,执行程序代码,就绪状态是进入到运行状态的入口,要想运行,就要先进入就绪态。
5.什么是TERMINATED状态?
线程执行完毕或者因为其他原因退出运行,表示该线程生命周期结束。
二、线程的状态图
三、线程状态转换
3.1 NEW、RUNNABLE、TERMINATED状态转换
class ThreadDemo3{
public static void main(String[] args) {
Thread t = new Thread(() -> {
for (int i = 0; i < 10; i++) {
}
}, "李四");
System.out.println(t.getName() + ": " + t.getState());;
t.start();
while (t.isAlive()) {
System.out.println(t.getName() + ": " + t.getState());;
}
System.out.println(t.getName() + ": " + t.getState());;
}
}
3.2 WAITING 、 BLOCKED 、 TIMED_WAITING 状态的转换
class ThreadDemo4{
public static void main(String[] args) {
final Object object = new Object();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (object) {
while (true) {
try {
Thread.sleep(1000);
// object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
},"t1");
t1.start();
System.out.println(t1.getState());
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (object) {
System.out.println("hehe");
}
}
}, "t2");
t2.start();
System.out.println(t1.getState());
}
}
使用 jconsole 可以看到 t1 的状态是 TIMED_WAITING , t2 的状态是 BLOCKED
3.3WAITING状态转换
class ThreadDemo4{
public static void main(String[] args) {
final Object object = new Object();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (object) {
while (true) {
try {
// Thread.sleep(1000);
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
},"t1");
t1.start();
System.out.println(t1.getState());
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (object) {
System.out.println("hehe");
}
}
}, "t2");
t2.start();
System.out.println(t1.getState());
}
}
使用 jconsole 可以看到 t1 的状态是 WAITING
结论:
- BLOCKED 表示等待获取锁, WAITING 和 TIMED_WAITING 表示等待其他线程发来通知.
- TIMED_WAITING 线程在等待唤醒,但设置了时限; WAITING 线程在无限等待唤醒