线程的生命周期在 Java 中是如何定义的?

在 Java 中,线程的生命周期可以细化为以下几个状态:

  • New(初始状态):线程对象创建后,但未调用 start() 方法。
  • Runnable(可运行状态):调用 start() 方法后,线程进入就绪状态,等待 CPU 调度。
  • Blocked(阻塞状态):线程试图获取一个对象锁而被阻塞。
  • Waiting(等待状态):线程进入等待状态,需要被显式唤醒才能继续执行。
  • Timed Waiting(含等待时间的等待状态):线程进入等待状态,但指定了等待时间,超时后会被唤醒。
  • Terminated(终止状态):线程执行完成或因异常退出。

操作系统中线程的生命周期

操作系统中线程的生命周期通常包括以下五个阶段:

  • 新建(New):线程对象被创建,但尚未启动。
  • 就绪(Runnable):线程被启动,处于可运行状态,等待CPU调度执行。
  • 运行(Running):线程获得CPU资源,开始执行run()方法中的代码。
  • 阻塞(Blocked):线程因为某些操作(如等待锁、I/O操作)被阻塞,暂时停止执行。
  • 终止(Terminated):线程执行完成或因异常退出,生命周期结束。

“线程的生命周期”是理解Java多线程行为的基础,与问题列表中的多个知识点密切相关

Java中如何创建多线程

在Java中,可以通过两种主要方式来创建线程:继承Thread类或实现Runnable接口。无论采用哪种方法,新创建的线程实例最初处于NEW状态。当调用该线程对象的start()方法时,线程进入RUNNABLE状态,这意味着它现在准备好由JVM调度执行了。这一步骤体现了从线程初始化到准备运行这一过程的状态转换。

Java中的wait、notify和notifyAll

  • wait() 方法用于让当前正在执行的线程暂停执行,并释放其持有的锁资源,直到其他线程调用了 notify() 或 notifyAll() 来唤醒等待队列中的一个或所有线程。此时,被唤醒的线程不会立即恢复执行,而是重新进入就绪状态(RUNNABLE),并尝试重新获取锁。
  • notify()notifyAll() 则是用来通知那些因调用wait()而处于等待状态的线程可以醒来并尝试继续执行的方法。值得注意的是,只有持有相同监视器锁的对象才能正确地调用这两个方法。

Thread.sleep 和 Thread.yield

  • Thread.sleep(long millis) 使当前执行的线程暂时停止指定时间(以毫秒为单位),期间不参与CPU调度,即进入TIMED_WAITING状态。之后自动恢复到RUNNABLE状态。
  • Thread.yield() 是一个提示给线程调度器的方法,表明当前线程愿意放弃处理器时间片给具有相同优先级的其他线程。但需要注意的是,这只是个建议,实际是否会发生切换取决于具体实现及当前系统负载情况。

Java中的线程同步

使用synchronized关键字或其他并发工具(如ReentrantLock)可以确保共享资源的安全访问。当一个线程试图访问已经被另一个线程锁定的代码块或对象时,它将被阻塞(BLOCKED)直至获得相应的锁。

Java线程池的原理

线程池是一种管理一组固定数量的工作线程的技术,旨在提高应用程序处理大量异步任务的能力。线程池中的线程通常会保持在RUNNABLE或者WAITING状态,一旦有新的任务提交进来,就会从现有空闲线程中选取一个去执行。完成任务后,线程并不会立即销毁,而是回到线程池中待命,这样可以减少频繁创建和销毁线程所带来的开销。

Java中的死锁

当两个或更多线程互相等待对方释放资源而无法继续执行时,就会发生死锁现象。这种情况下的线程都处于BLOCKED状态。了解线程的不同状态及其转换规则有助于识别潜在的死锁风险,并采取措施预防之,例如避免嵌套锁、按照固定顺序加锁等策略。

Java 中的协程(虚拟线程)

虚拟线程的生命周期与传统线程类似,但其阻塞行为由 JVM 优化,可能不会显式进入 BLOCKED 或 WAITING,而是挂起以支持高并发。

posted @ 2025-05-08 21:57  虾11  阅读(52)  评论(0)    收藏  举报