JavaEE初阶: 理解线程状态及状态转移

图片[1]-JavaEE初阶: 理解线程状态及状态转移-山海云端论坛

在Java中,线程是一种重要的并发编程机制,了解线程的状态及其转移对于有效地管理并发任务至关重要。本文将深入探讨Java线程的状态以及在不同状态之间的转移过程。

线程的状态

Java中的线程状态由枚举类型Thread.State表示,常见的线程状态包括:

  1. NEW(新建): 线程对象已被创建,但尚未调用start()方法,此时线程处于初始状态,等待调度。
  2. RUNNABLE(可运行): 分为就绪状态和运行中状态。
    • 就绪状态表示线程已经准备好执行,但尚未被调度执行。
    • 运行中状态指示线程已被调度执行,并正在运行或准备运行。
  3. BLOCKED(阻塞): 线程等待获取锁以进入同步代码块或方法,处于阻塞状态。
  4. WAITING(等待): 线程等待其他线程显式地唤醒,无超时限制。
  5. TIMED_WAITING(定时等待): 线程等待其他线程显式地唤醒,但有超时限制。
  6. TERMINATED(终止): 线程的run()方法执行完成或主线程的main()方法执行完成,线程终止。

线程状态转移的意义

图片[2]-JavaEE初阶: 理解线程状态及状态转移-山海云端论坛

理解线程状态转移有助于有效地管理线程行为和资源。

  • 就绪状态到运行状态: 当线程被调度程序选中并开始执行时,线程从就绪状态转变为运行状态。
  • 阻塞状态: 当线程试图进入同步代码块或方法但无法获得锁时,线程进入阻塞状态,等待锁的释放。
  • 等待状态: 在等待其他线程显式唤醒的过程中,线程处于等待状态,无限期等待或有超时限制。
  • 终止状态: 当线程的任务完成或线程执行过程中发生未捕获的异常时,线程进入终止状态。

观察线程状态转移

观察 1:NEW、RUNNABLE、TERMINATED状态转移

<code>public class ThreadStateTransfer { public static void main(String[] args) throws InterruptedException { 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()); } }</code>

观察 2:WAITING、BLOCKED、TIMED_WAITING状态转移

<code>public class TestMain { 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 { object.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } }, "t1"); t1.start(); Thread t2 = new Thread(new Runnable() { @Override public void run() { synchronized (object) { System.out.println("hehe"); } } }, "t2"); t2.start(); } }</code>

观察 3:使用yield()方法

<code>public class Main { public static void main(String[] args) { Thread t1 = new Thread(new Runnable() { @Override public void run() { while (true) { System.out.println("张三"); //Thread.yield(); } } }, "t1"); t1.start(); Thread t2 = new Thread(new Runnable() { @Override public void run() { while (true) { System.out.println("李四"); } } }, "t2"); t2.start(); } }</code>

结论

通过观察不同状态之间的转移,我们可以更好地理解线程在并发环境中的行为和状态变化,从而更有效地进行并发编程。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容