Java中的多线程解释[带示例]

已发表: 2021-06-15

目录

Java中的线程

Java 中的线程有助于程序的高效运行。 形式执行的两个基本单元是进程和线程。 进程可能是应用程序、程序或自包含执行环境。

而线程与进程共享资源并与之共存。 每个 Java 应用程序中至少存在一个线程,称为主线程。 可以从主线程创建多个线程。 了解有关如何在 Java 中创建线程的更多信息。

Java 线程的好处

  • 与进程相比,创建线程所需的时间和资源更少。 因此线程也被称为轻量级进程。
  • 父进程数据和代码由线程共享。
  • 与进程中的相互通信相比,线程之间的相互通信更容易。
  • Java 中的线程可以通过 java.lang 的实现来创建。 可运行接口。

单线程

在一个程序中存在几个处理单元,其中最小的一个被称为单线程。 通过使用“线程类”,Java 应用了线程。 存在两种类型的线程; 守护线程和用户线程。

当要清理应用程序时,会使用守护线程。 它在应用程序的后台运行。 而用户线程是在应用程序首次启动时创建的。

单线程的优点:

  • 随着系统中发生单个线程的执行,应用程序开销减少。
  • 使用单线程降低了应用程序的维护成本。

Java中的多任务处理

多任务处理是指 CPU 一次执行多个任务的过程。 有时,用户可能会在任务之间进行 CPU 切换,以便与每个程序一起协作。 单独的内存和资源分配给多任务处理中的进程。 通过两种方式,可以实现多任务处理。

1. Multiprocessing(基于进程的多任务处理)

  • 为每个进程分配一个单独的内存区域。 因此,内存中的每个进程都有一个地址。
  • 这些过程是重量级的。
  • 进程之间的通信成本很高。
  • 在进程之间切换需要一些时间。 这是更新列表、内存映射等所必需的。

2. Multithreading(基于线程的多任务)

  • 线程之间共享相同的地址。
  • 线程是轻量级的。
  • 线程之间的通信成本很低。

什么是多线程?

当一个程序中同时执行两个或多个线程时,这种机制称为多线程。 单个进程会创建许多线程,从而增加计算能力。 一个程序的两个或多个部分以导致 CPU 利用率最大化的方式执行。

线程被称为程序的各个部分。 应用程序中的进程可以包含多个线程或单个线程。
Java 虚拟机允许应用程序的多个线程。 每个线程都有自己的优先级。 因此,与具有较低优先级的线程相比,优先执行具有较高优先级的线程。

为了实现多任务,多线程和多处理的过程都被使用。 因为共享内存区域用于多线程,所以它主要用于多处理。 内存被保存,因为不需要额外分配内存。 此外,由于线程之间发生上下文切换,因此所花费的时间少于多处理。

在动画、游戏中,使用Java多线程 如果您想了解有关 Java 体系结构和组件的更多信息,请单击。

有两种机制可用于创建线程。

1.线程类扩展

2.Runnable接口实现

线程类与可运行接口

  • 扩展“线程类”不能扩展其他类,因为 Java 不支持多重继承。 但是通过“Runnable”接口的实现,可以从该类扩展其他基类。
  • 可以通过扩展 Thread 类来扩展线程的基本功能,因为它提供了诸如 interrupt()、yield() 等内置方法。
  • 使用runnable时会提供一个多线程可以共享的对象。

Java 线程类

Java中的线程编程是通过线程类实现的。 构造函数由线程类和执行线程操作的方法提供。 线程类实现了一个可运行接口并扩展了 Object 类。

一些常用的线程方法是:

  1. start():通过该方法启动线程执行。 JVM 调用 run() 方法。
  2. sleep(int milliseconds):线程的执行暂停了几毫秒,这是因为线程进程通过此方法进入睡眠状态。 暂停后,线程的执行再次开始。 线程可以通过这种方法进行同步。
  3. getName():通过该方法返回线程名。
  4. setPriority(int new priority):通过该方法改变线程优先级。
  5. yield():通过该方法使当前线程随着其他线程的执行而停止。
  6. run():该方法用于在线程中启动一个动作。
  7. getPriority():通过使用该方法返回线程优先级。
  8. setName():通过此方法更改线程名称。
  9. getId():通过该方法返回线程id。
  10. suspend():线程通过这个方法被挂起。

线程生命周期

线程生命周期有不同的阶段,列举如下:

  1. 新增: “线程类”用于在此阶段创建线程。 在线程启动之前,程序停留在这个阶段。 该方法也称为天生线程。
  2. Runnable: start方法在线程生命周期的这个阶段调用线程实例。 调度程序被移交给线程的控制以完成执行。 是否应该执行线程取决于调度程序。
  3. 运行:一旦线程开始执行,阶段就转移到“运行”阶段。 调度程序从线程池中选择一个线程并开始执行应用程序。
  4. 等待:顾名思义,在生命周期的这个阶段,线程等待。 由于在应用程序中运行多个线程,线程同步是必不可少的。 因此,一个线程有必要等待,直到另一个线程的执行结束。 因此,生命周期的阶段也称为等待阶段。
  5. Dead:线程终止的阶段称为“dead”阶段。 一旦线程从运行转移到处理结束,它就会终止,因此处于“死状态”

Java中的线程同步

在多线程的情况下,程序中会发生异步行为。 如果假设数据是通过一个线程写入的,而数据的读取同时由另一个线程执行,则可能会在应用程序中产生不一致。

线程之间共享的资源需要被其他线程访问。 因此,在这种情况下,接近同步的方法。 Java 中提供了同步方法来实现同步行为。

当一个线程到达同步块时,一旦到达,该方法就不能被同一对象上的其他线程调用。 在线程完成执行块并退出之前,其他线程必须停止并等待。

从世界顶级大学在线学习软件课程获得行政 PG 课程、高级证书课程或硕士课程,以加快您的职业生涯。

多线程的优点

  • 可以同时执行多个操作。 随着独立线程的运行,用户不会被阻塞。
  • 由于多个操作一起运行,因此节省了时间。
  • 一个线程不能被另一个线程影响,因为它们是独立的。 一个线程发生异常不会影响其他线程的执行。

多线程示例

java中的多线程程序示例如下所示:

资源

图 1:多线程代码示例的片段

代码说明

第 3 行:“GuruThread1”类实现了 runnable。

第 8 行:显示类主方法。

第 9 行:实例化线程类并创建实例“guruThread1”并创建线程。

第 10 行:实例化“Thread 类”并创建实例“guruThread2”和线程。

第 11 行:启动名为 guruThread1 的线程。

第 12 行:启动名为 guruThread2 的线程。

第 13 行:输出文本“Thread names are following:”。

第 14 行:方法 getName() 用于获取 thread1 名称。

第 15 行:方法 getName() 用于获取 thread2 名称。

执行上述代码会产生以下输出:

资源

图: Java 多线程程序生成的输出截图(取自

结论

本文讨论了Java 中的多线程概念以及 Java中的多线程程序示例 您的学习并不止于此,还要了解 Java 的所有其他基础概念。

如果您有兴趣以实惠的价格掌握编程技能并为行业做好准备,您可以查看 upGrad 提供的“计算机科学理学硕士”课程。 它适用于 21 至 45 岁年龄段的所有中级专业人士。 该课程由利物浦约翰摩尔斯大学认证,设计有 500 多个小时的学习时间、309 个项目和作业,让您发挥出最好的一面。 如果您有任何疑问,请给我们留言,我们的团队将与您联系。

踏上梦想的工作

从 IIIT-B 申请软件开发执行 PG 计划