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 类。
一些常用的线程方法是:
- start():通过该方法启动线程执行。 JVM 调用 run() 方法。
- sleep(int milliseconds):线程的执行暂停了几毫秒,这是因为线程进程通过此方法进入睡眠状态。 暂停后,线程的执行再次开始。 线程可以通过这种方法进行同步。
- getName():通过该方法返回线程名。
- setPriority(int new priority):通过该方法改变线程优先级。
- yield():通过该方法使当前线程随着其他线程的执行而停止。
- run():该方法用于在线程中启动一个动作。
- getPriority():通过使用该方法返回线程优先级。
- setName():通过此方法更改线程名称。
- getId():通过该方法返回线程id。
- suspend():线程通过这个方法被挂起。
线程生命周期
线程生命周期有不同的阶段,列举如下:
- 新增: “线程类”用于在此阶段创建线程。 在线程启动之前,程序停留在这个阶段。 该方法也称为天生线程。
- Runnable: start方法在线程生命周期的这个阶段调用线程实例。 调度程序被移交给线程的控制以完成执行。 是否应该执行线程取决于调度程序。
- 运行:一旦线程开始执行,阶段就转移到“运行”阶段。 调度程序从线程池中选择一个线程并开始执行应用程序。
- 等待:顾名思义,在生命周期的这个阶段,线程等待。 由于在应用程序中运行多个线程,线程同步是必不可少的。 因此,一个线程有必要等待,直到另一个线程的执行结束。 因此,生命周期的阶段也称为等待阶段。
- 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 个项目和作业,让您发挥出最好的一面。 如果您有任何疑问,请给我们留言,我们的团队将与您联系。