Java中线程的生命周期

已发表: 2023-01-27

目录

Java 线程基础:

Java 中的线程有助于在单个进程内执行多个活动。 它被认为是一个轻量级的过程。 线程也可以定义为一系列已执行的语句。 Java 中的每个线程都有自己的堆栈、程序计数器和局部变量。 Java 线程也可能是一系列嵌套的方法调用。 内存、每个进程的状态和文件由线程共享。

Java中线程的使用:

    • 执行后台或异步处理
    • 增强 GUI 应用程序的灵敏度
    • 实现多处理器系统的积极方面
    • 在存在多个的情况下简化编程逻辑

调用线程时存在两条执行路径。 两条路径之一用于线程执行,另一条路径将跟踪线程调用之后的语句。 Java中的每个线程都有独立的内存空间和栈。

在 Java 代码中使用线程时遇到的风险因素如下。

  • 在线程访问公共变量以一致地查看数据的情况下,需要线程之间的适当协调。
  • 线程的性能和维护,如果在程序中过度使用,就会变得困难。

Java中线程的生命周期:

在程序执行的任何时刻,Java 中的线程都处于以下任何一种状态。

  1. 新的
  2. 封锁
  3. 可运行
  4. 定时等待
  5. 等待
  6. 终止

Java线程生命周期详解

新线程:

新创建的线程处于“新建”状态。 在此状态下不进行运行。 处于新状态的线程代码的执行尚未发生。 它尚未运行。

可运行状态:

处于可运行状态的线程已准备好运行。 处于此状态的线程可能随时准备运行,也可能已经在运行。 线程调度程序负责为线程运行分配时间。 在多线程程序中,每个单独的线程都被分配了特定的时间。 每个单独的线程运行一小段时间,然后遇到暂停。 然后将 CPU 交给另一个线程,以便为其他线程提供运行机会。 此时,所有等待CPU的准备运行线程和当前正在运行的线程都处于可运行状态。

查看我们的免费技术课程,在竞争中脱颖而出。

探索我们的热门软件工程课程

LJMU & IIITB 计算机科学硕士 加州理工学院 CTME 网络安全证书课程
全栈开发训练营 区块链PG项目
全栈开发中的执行 PG 计划
在下面查看我们所有的课程
软件工程课程

等待/阻塞状态:

当线程暂时不运行时,它处于以下任何一种状态。

  • 等待
  • 封锁

等待 I/O 完成的线程处于阻塞状态。 线程调度器的功能是通过重新激活阻塞或等待线程来调度它的执行。 处于此状态的任何线程都不允许进一步继续执行,直到它转换为可运行状态。 处于阻塞或等待状态的线程不使用任何 CPU 周期。

当一个线程试图访问当前受其他线程保护的代码的受保护部分时,它会被强制阻塞。 当为所有线程解锁该部分时,调度程序将等待受保护部分的线程之一转换为可运行状态。 另一方面,当一个线程在特定条件下等待另一个线程时,它处于等待状态。 一旦满足指定的等待条件,处于等待状态的线程将被推送到可运行状态。 如果当前正在运行的线程进入等待/阻塞状态,则线程调度程序会调度可运行序列中的另一个线程运行。

定时等待:

当使用超时参数调用方法时,线程处于定时等待状态。 线程将继续处于此状态,直到指定的超时完成或直到收到通知。 例如,如果一个线程调用条件等待或睡眠,它就会转换为定时等待状态。

终止状态:

由于以下任一原因,线程会终止。

  • 线程内代码段执行完成后线程正常退出。
  • 发生任何罕见的错误事件,例如未处理的异常和分段错误。

处于终止状态的线程不消耗任何 CPU 周期。

从世界一流大学在线学习软件开发课程。 获得执行 PG 课程、高级证书课程或硕士课程,以快速推进您的职业生涯。

需求软件开发技能

JavaScript 课程 核心 Java 课程 数据结构课程
Node.js 课程 课程 全栈开发课程
NFT课程 开发运营课程 大数据课程
React.js 课程 网络安全课程 云计算课程
数据库设计课程 Python 课程 加密货币课程

Java中线程状态的实现:

要在 Java 中完成线程的当前状态,我们使用方法 Thread.getState()。 Java 还提供了 java.lang.Thread.State 类,其中定义了线程状态的 ENUM 常量。 详细信息总结在下表中。

常量类型宣言描述
新的公共静态最终 Thread.State 新它是刚刚创建但尚未开始执行的线程的线程状态。
可运行public static final Thread.State RUNNABLE 它描述了已经运行的线程或处于准备运行状态的线程的状态。

同一线程对于 Java 虚拟机可以处于可运行状态,而对于其他操作系统资源(例如处理器)则处于等待状态。

封锁public static final Thread.State BLOCKED 它描述了阻塞等待监视器锁的线程的状态。 它保持相同的状态,直到监视器块进入同步方法/块或在调用 Object.wait() 后重新进入同步方法。
等待公共静态最终 Thread.State 等待它描述了由于调用以下方法之一而等待的线程状态。

  1. Object.wait 没有超时
  2. LockSupport.park
  3. Thread.join 没有超时

等待状态可能是因为另一个线程完成了特定任务。

定时等待公共静态最终 Thread.State TIMED_WAITING 它是等待指定时间的线程的一种状态。 调用以下任何方法都会导致线程处于定时等待状态,并具有指定的正等待时间。

  1. Thread.join 超时
  2. Object.wait 超时
  3. LockSupport.partUntil
  4. LockSupport.parkNanos
终止public static final Thread.State 已终止它是已完成执行其组成代码语句的线程的状态。

线程刚创建时处于 NEW 状态。 当在线程上调用 .start() 方法时,线程调度程序会将其移至 Runnable 状态。 当在线程实例上调用 join() 方法时,当前正在执行代码语句的线程将等待该线程终止。 因此,在控制台上打印最终语句之前,程序会在线程 2 上调用 join() 函数,并使线程 1 保持等待状态,直到线程 2 完成其执行并进入终止状态。 由于线程 1 正在等待线程 2 的执行完成,因此它处于 WAITING 状态。

阅读我们与软件开发相关的热门文章

如何在 Java 中实现数据抽象? Java中的内部类是什么? Java 标识符:定义、语法和示例
通过示例了解 OOPS 中的封装 C 中的命令行参数解释 2022 年云计算的十大特点
Java 中的多态性:概念、类型、特征和示例 Java 中的包以及如何使用它们? Git 初学者教程:从零开始学习 Git

在 Java 程序中使用线程的优缺点:

在 Java 程序中使用线程有以下好处。

  • 减少开发代码所需的时间
  • 降低维护成本
  • 增强复杂应用程序的性能
  • 提高用户界面的响应度
  • 并行化任务
  • 线程用于服务器应用程序以提高资源的高吞吐量和利用率。
  • 如果一个线程无法使用所有 CPU 的计算资源,则另一个线程的运行将保持这些资源的占用。
  • 如果同一组数据被多个线程操作,它们的缓存是可以共享的。 这导致更好地使用缓存或协调其值。

在 Java 程序中使用线程有几个缺点。 下面列出了其中一些。

  • 在共享缓存、转换后备缓冲区 (TLB) 或任何其他硬件资源时,多个线程可能会相互干扰。
  • 即使只有一个线程在运行,也不能提高线程的执行时间。 然而,执行时间的降低是允许的。 这可能是由于额外的流水线阶段和/或适应线程切换硬件所需的较慢频率。
  • 与多处理相比,操作系统和应用程序都需要进行大量更改,因为硬件支持更多地暴露于多线程中的软件。

如果您有兴趣了解有关 Java、全栈软件开发的更多信息,请查看 upGrad 和 IIIT-B 的软件开发执行 PG 课程——全栈开发专业化,该课程专为在职专业人士设计,并提供 500 多个小时的严格培训、9 个以上的项目和任务、IIIT-B 校友身份、实用的实践顶点项目和顶级公司的工作协助。

想要分享这篇文章?

为未来的职业做准备

立即申请软件工程硕士