线程的生命周期在 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,而是挂起以支持高并发。


浙公网安备 33010602011771号