资讯动态

多线程:6种状态及其转换条件

发布时间:2026/9/8 22:25:44 来源:尧图企业网站定制
根据Thread类的源码Java线程共有6种状态一NEW新建状态线程被创建但尚未启动的状态。当使用new Thread()创建一个线程对象后但还没有调用start()方法时线程就处于NEW状态。此时线程已经分配了内存空间但还没有开始执行。Thread thread new Thread(() - {System.out.println(线程执行中);});System.out.println(线程状态 thread.getState()); // 输出NEW二RUNNABLE可运行状态线程正在Java虚拟机中执行或准备执行等待系统资源如CPU时间片。RUNNABLE状态实际上包含了两种子状态- Ready线程已经准备好运行正在等待CPU时间片- Running线程正在CPU上执行需要注意的是处于RUNNABLE状态的线程不一定正在执行可能只是在等待CPU调度。Thread thread new Thread(() - {System.out.println(线程状态 Thread.currentThread().getState()); // 输出RUNNABLE});thread.start();三BLOCKED阻塞状态线程被阻塞正在等待获取一个监视器锁monitor lock。当线程试图进入一个被其他线程持有的同步代码块或方法时就会进入BLOCKED状态。一旦锁被释放等待的线程就有机会获取锁并继续执行。public class BlockedExample {private static final Object lock new Object();public static void main(String[] args) {Thread thread1 new Thread(() - {synchronized (lock) {try {Thread.sleep(5000); // 持有锁5秒} catch (InterruptedException e) {e.printStackTrace();}}});Thread thread2 new Thread(() - {synchronized (lock) {System.out.println(thread2获取到锁);}});thread1.start();try { Thread.sleep(100); } catch (InterruptedException e) {}thread2.start();try { Thread.sleep(100); } catch (InterruptedException e) {}System.out.println(thread2状态 thread2.getState()); // 输出BLOCKED}}四WAITING无限期等待状态线程无限期地等待另一个线程执行特定操作。进入WAITING状态的方法- Object.wait() - 不带超时时间- Thread.join() - 不带超时时间- LockSupport.park()退出WAITING状态的条件- 其他线程调用对应对象的notify()或notifyAll()- 其他线程中断当前线程- 等待的线程执行完成针对join情况public class WaitingExample {public static void main(String[] args) throws InterruptedException {Object lock new Object();Thread waitingThread new Thread(() - {synchronized (lock) {try {lock.wait(); // 进入WAITING状态System.out.println(被唤醒继续执行);} catch (InterruptedException e) {e.printStackTrace();}}});waitingThread.start();Thread.sleep(100);System.out.println(等待线程状态 waitingThread.getState()); // 输出WAITINGsynchronized (lock) {lock.notify(); // 唤醒等待线程}}}五TIMED_WAITING限期等待状态线程在指定的时间范围内等待。进入TIMED_WAITING状态的方法- Thread.sleep(long millis)- Object.wait(long timeout)- Thread.join(long millis)- LockSupport.parkNanos(long nanos)- LockSupport.parkUntil(long deadline)public class TimedWaitingExample {public static void main(String[] args) throws InterruptedException {Thread thread new Thread(() - {try {Thread.sleep(5000); // 睡眠5秒进入TIMED_WAITING} catch (InterruptedException e) {e.printStackTrace();}});thread.start();Thread.sleep(100);System.out.println(线程状态 thread.getState()); // 输出TIMED_WAITING}}六TERMINATED终止状态线程已经执行完毕或异常结束。线程执行完run()方法或者因为未捕获的异常而退出时就会进入TERMINATED状态。一旦进入此状态线程就不能再次启动。public class TerminatedExample {public static void main(String[] args) throws InterruptedException {Thread thread new Thread(() - {System.out.println(线程执行完成);});thread.start();thread.join(); // 等待线程执行完成System.out.println(线程状态 thread.getState()); // 输出TERMINATED}}七线程状态转换图

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价