2026/4/21 12:27:39
网站建设
项目流程
网站建设评审验收会议主持词,a站下载安装,安定网站建设,网站设计中级一、观察线程的所有状态在 Java 中#xff0c;线程的状态是由 Thread.State 枚举定义的#xff0c;一共有 6 种状态。这些状态代表了线程从创建到销毁的各个阶段。我们可以通过 Thread.getState() 方法来获取当前线程的状态。以下是所有线程状态的列表#xff1a;NEW#x…一、观察线程的所有状态在 Java 中线程的状态是由 Thread.State 枚举定义的一共有 6 种状态。这些状态代表了线程从创建到销毁的各个阶段。我们可以通过 Thread.getState() 方法来获取当前线程的状态。以下是所有线程状态的列表NEW线程刚刚创建但尚未启动调用 start() 方法之前。RUNNABLE线程已经启动正在执行或等待 CPU 调度。这包括线程在运行或就绪状态。BLOCKED线程正在等待监视器锁monitor lock通常发生在进入 synchronized 块或方法时被阻塞。WAITING线程正在无限期等待另一个线程的特定操作例如调用 Object.wait()、Thread.join() 或 LockSupport.park()。TIMED_WAITING类似于 WAITING但有时间限制例如调用 Thread.sleep()、Object.wait(long timeout) 或 Thread.join(long millis)。TERMINATED线程执行完成或异常退出已结束生命周期。二、线程状态和状态转移的意义状态转移的意义NEW → RUNNABLE调用 thread.start()。意义启动线程进入可执行状态。这是线程“出生”的关键一步。RUNNABLE → BLOCKED尝试获取已被占用的锁。意义体现了互斥访问的必要性避免数据竞争。RUNNABLE → WAITING调用 wait()、join() 等。意义实现线程协作如生产者-消费者模式。RUNNABLE → TIMED_WAITING调用 sleep() 或带时限的 wait()。意义引入时间维度适用于延迟执行或超时机制。BLOCKED → RUNNABLE获取到锁。意义阻塞结束继续执行。WAITING/TIMED_WAITING → RUNNABLE收到 notify()、超时或中断。意义唤醒机制确保线程不会永久卡住。RUNNABLE → TERMINATEDrun() 方法执行完毕或抛出未捕获异常。意义正常或异常结束释放资源。三、观察线程的状态和观察 1:关注 NEW 、 RUNNABLE 、 TERMINATED 状态的转换public class Observation1 { public static void main(String[] args) throws InterruptedException { // 创建线程 (NEW 状态) Thread simpleThread new Thread(() - { System.out.println(Thread is running... Doing some work.); // 模拟工作结束后自然进入 TERMINATED }); // 观察 NEW 状态 System.out.println(State after creation: simpleThread.getState()); // NEW // 启动线程 (NEW - RUNNABLE) simpleThread.start(); Thread.sleep(100); // 短暂等待确保线程进入 RUNNABLE System.out.println(State after start: simpleThread.getState()); // RUNNABLE // 等待线程结束 (RUNNABLE - TERMINATED) simpleThread.join(); System.out.println(State after termination: simpleThread.getState()); // TERMINATED } }观察 2:关注 WAITING 、 BLOCKED 、 TIMED_WAITING 状态的转换public class Observation2 { private static final Object lock new Object(); public static void main(String[] args) throws InterruptedException { // 创建工作者线程 Thread workerThread new Thread(() - { try { // 进入 TIMED_WAITING (sleep) System.out.println(Entering TIMED_WAITING via sleep...); Thread.sleep(1000); // 进入 WAITING (wait) synchronized (lock) { System.out.println(Entering WAITING via wait...); lock.wait(); } // 模拟工作结束 System.out.println(Worker thread resuming after notify.); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } }); // 创建阻塞模拟线程先占用锁 Thread blockerThread new Thread(() - { synchronized (lock) { try { System.out.println(Blocker holding lock for 2 seconds...); Thread.sleep(2000); // 占用锁迫使其他线程 BLOCKED } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }); // 启动 blocker 先占用锁 blockerThread.start(); Thread.sleep(100); // 确保 blocker 先运行 // 启动 worker (进入 RUNNABLE) workerThread.start(); Thread.sleep(100); System.out.println(Worker state after start: workerThread.getState()); // RUNNABLE // 观察 TIMED_WAITING (sleep) Thread.sleep(500); System.out.println(Worker state during sleep: workerThread.getState()); // TIMED_WAITING // 等待 sleep 结束worker 尝试 wait但需先获取锁可能 BLOCKED Thread.sleep(1000); System.out.println(Worker state when trying to acquire lock for wait: workerThread.getState()); // BLOCKED (如果 blocker 还在占用) // 等待 blocker 释放锁worker 进入 WAITING Thread.sleep(1500); System.out.println(Worker state during wait: workerThread.getState()); // WAITING // 唤醒 worker (WAITING - RUNNABLE) synchronized (lock) { lock.notify(); } Thread.sleep(100); System.out.println(Worker state after notify: workerThread.getState()); // RUNNABLE 或 TERMINATED // 等待结束 workerThread.join(); blockerThread.join(); } }