10.Java线程的状态
Java中线程的状态
Thread类中有一个枚举类,定义了线程的状态
- NEW:只是创建了一个java线程对象,还没有start ;
- RUNNABLE:处于可运行状态的线程正在Java虚拟机中执行,但它可能正在等待来自操作系统的其他资源,如CPU;
- BLOCKED:线程尝试获得锁,但是锁已经被其他线程拥有了,当前线程就会进入阻塞状态 ;
- WAITING: 处于永久等待状态。
- 线程调用以下某个方法进入这种状态:
- Object.wait()
- thread.join()
- LockSupport.park
- 此时线程正在等待另一个线程执行特定操作。例如:
- 调用对象的Object.wait()方法的线程正在等待另一个线程对该对象调用Object.notify()或Object.notifyAll()
- 调用Thread.join()的线程正在等待指定的线程终止。
- 线程调用以下某个方法进入这种状态:
- TIMED_WAITING:有时限的等待。
- 线程调用以下某个方法进入这种状态:
- Thread.sleep(timeout)
- Object.wait(timeout)
- thread.join(timeout)
- LockSupport.parkNanos
- LockSupport.parkUntil
- 线程调用以下某个方法进入这种状态:
- TERMINATED:线程已完成执行。
示例
public class StateDemo {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {}, "t1");Thread t2 = new Thread(() -> {while (true) {}}, "t2");t2.start();Thread t3 = new Thread(() -> {log.debug("running...");}, "t3");t3.start();Thread t4 = new Thread(() -> {synchronized (StateDemo.class) {try {Thread.sleep(100000);} catch (InterruptedException e) {e.printStackTrace();}}}, "t4");t4.start();Thread t5 = new Thread(() -> {try {t2.join();} catch (InterruptedException e) {e.printStackTrace();}}, "t5");t5.start();Thread t6 = new Thread(() -> {synchronized (StateDemo.class) {log.debug("");}}, "t6");t6.start();Thread.sleep(500);log.debug("t1:" + t1.getState());log.debug("t2:" + t2.getState());log.debug("t3:" + t3.getState());log.debug("t4:" + t4.getState());log.debug("t5:" + t5.getState());log.debug("t6:" + t6.getState());System.exit(1);}
}
输出:
2025-10-04 11:40:51.581 [t3] c.StateDemo - running...
2025-10-04 11:40:52.087 [main] c.StateDemo - t1:NEW
2025-10-04 11:40:52.087 [main] c.StateDemo - t2:RUNNABLE
2025-10-04 11:40:52.087 [main] c.StateDemo - t3:TERMINATED
2025-10-04 11:40:52.087 [main] c.StateDemo - t4:TIMED_WAITING
2025-10-04 11:40:52.087 [main] c.StateDemo - t5:WAITING
2025-10-04 11:40:52.087 [main] c.StateDemo - t6:BLOCKED