目录
一、线程的状态
线程的状态一共有 6 种:
- NEW:安排了工作,还未开始行动(调用 start 方法之前)。
- RUNNABLE:可工作的。又可分为正在工作中和即将开始工作。
- BLOCKED:表示排队等着其他事情。(同步阻塞,因为资源竞争而引起的阻塞(锁))
- WAITING:表示排队等着其他事情。(等待阻塞,需要其他线程唤醒)
- TIMED_WAITING:表示排队等着其他事情。(计时等待阻塞,只等待一定的时间)
- TERMINATED:工作完成了。
1. NEW
把 Thread 对象创建好了,但是还没有调用 start。
public static void main(String[] args) {
Thread t = new Thread(() -> {
});
System.out.println(t.getState()); //输出 NEW
}
2. TERMINATED
操作系统中的线程已经执行完毕,销毁了,但是 Thread 对象还在时,获取到的状态就是TERMINATED。
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
});
t.start();
Thread.sleep(1000);
System.out.println(t.getState()); //输出 TERMINATED
}
3. RUNNABLE
就绪状态,处于这个状态的线程,就是在就绪队列中。即随时可以被调度到 CPU上。如果代码中没有进行 sleep ,也没有进行其他的可能导致阻塞的操作,代码大概率是处在 RUNNABLE 状态。
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
while(true) {
//这里什么都不能有
}
});
t.start();
Thread.sleep(1000);
System.out.println(t.getState()); //输出 RUNNABLE
}
上述代码中,t 线程里一直持续不断的执行循环,随时系统向调度它上 CPU 都是可以的。
4. TIMED_WAITING
代码中调度了 sleep(或者join(超时时间)) ,就会进入 TIMED_WAITING 状态。意思就是当前的线程在一定时间之内,是阻塞状态。一定时间结束后,阻塞状态解除。
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
while(true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t.start();
Thread.sleep(1000);
System.out.println(t.getState()); //输出 TIMED_WAITING
}
上述代码中,因为 t 线程循环内部只有 sleep 方法,所以该线程大概率一直处在 sleep 中,因此获取 t 线程状态显示 TIMED_WAITING。
5. BLOCKED
当前线程在等待锁,导致了阻塞(阻塞状态之一)。使用 sychronized 时候,可能会出现该状态。
6. WAITING
当前线程在等待唤醒,导致了阻塞(阻塞状态之一)。使用 wait 时候,可能会出现该状态。
二、线程状态转换
1. 线程状态转换简图