Thread的状态
Thread几种状态
NEW(未启动状态)
Thread t = new Thread() { @Override public void run() { System.out.println(Thread.currentThread().getName()); } }; System.out.println(t.getState().name());
RUNNABLE(可运行状态)
处于可运行状态的线程正在 Java 虚拟机中执行,但也可能是正在等待来自操作系统资源,例如 CPU。
Thread t = new Thread() { @Override public void run() { System.out.println(Thread.currentThread().getName()); } }; t.start(); System.out.println(t.getState().name());
BLOCKED(阻塞状态)
final Object lock = new Object(); Thread t = new Thread() { @Override public void run() { synchronized (lock) { System.out.println(Thread.currentThread().getName()); } } }; synchronized (lock) { try { t.start(); Thread.sleep(1000); System.out.println(t.getState().name()); } catch (InterruptedException e) { e.printStackTrace(); } }
WAITING(等待状态)
调用以下方法,使线程处于等待状态:
Object.wait()、Thread.join()、LockSupport.park()
Object.wait(): wait() 是 Java 中 Object 类的一个方法。 它用于线程间通信和同步。 当一个线程调用某个对象的 wait() 方法时,它会释放该对象上的锁,并进入等待状态,直到另一个线程使用相同对象上的 notify() 或 notifyAll() 方法通知它。 wait() 必须在同步的代码块或方法中调用,否则会抛出 IllegalMonitorStateException 异常。 它通常用于生产者-消费者场景或者在线程需要协调它们的操作时使用。 Thread.join(): join() 是 Java 中 Thread 类的一个方法。 它用于等待一个线程完成执行,然后再继续当前线程的执行。 当一个线程调用另一个线程的 join() 方法时,它会阻塞直到另一个线程执行完毕或者指定的超时时间到期。 在主线程需要等待工作线程完成任务后再继续执行时通常会使用 join()。 LockSupport.park(): park() 是 Java 中 LockSupport 类的一个方法。 它提供了比 wait() 和 join() 更低级别的线程同步机制。 它会使当前线程无限期地阻塞,直到被中断或者调用 unpark() 方法并传入当前线程作为参数来解除阻塞。 与 wait() 不同,park() 不需要在任何对象上同步。 它通常用于更高级的同步场景或者处理低级别的并发构造,比如锁或同步器。
TIMED_WAITING(具有指定时间的等待状态)
Thread t = new Thread() { @Override public void run() { try { Thread.sleep(2000); System.out.println(Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } } }; t.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(t.getState().name());
TERMINATED(已终止线程的线程状态或线程已完成执行)
Thread t = new Thread() { @Override public void run() { System.out.println(Thread.currentThread().getName()); } }; t.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(t.getState().name());
标签:
并发编程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!