Java 中的并行编程

10 Sept 2024 | 5 分钟阅读

在本文中,我们将学习一个称为并发编程的主题。在本文中,我们将学习为什么要在 Java 中使用并发编程以及在哪里使用它。这将帮助我们理解并发编程的重要性以及它与多线程的区别。

Java 中的并发编程是什么?

并发编程是一个将复杂问题分解成更小、更简单的任务的过程,这些任务可以使用多个计算机资源同时执行。在并发编程的过程中,彼此独立的任务使用不同的计算机或计算机 CPU 中的多个核心并行执行。并发编程是公司处理重型和大型项目的基本必需品,因为它们需要维持其经济标准。由于并发编程,项目的速度得到了提高,错误的可能性也降低了。

并发编程与**多线程**有很大不同,因为它不要求任务遵循执行顺序。并发编程的每个任务都根据它们需要执行的功能进行设计。因此,它被称为**函数式并行**或**数据并行**。

为什么使用并发编程?

随着多核 CPU 近期取得的进步,可以通过实现并发编程来最大限度地提高其效率。基本上,并发编程是指由于多处理资源(如处理核心)的可用性而导致的进程并行执行。并发编程被认为是一种比多线程更有效的方法。同时解决的并行任务被组合起来,为更大的问题提供最终解决方案。

Java 标准环境(**Java SE**)为程序员提供了“Fork/Join 框架”。Fork/Join 框架帮助程序员在其应用程序中轻松实现并发编程。但 Fork/Join 框架带来的复杂性在于程序员需要自己指定程序如何分解成任务。使用聚合操作,Java 运行时将为我们执行此分解。

Java SE 中的 Fork/Join 框架

**java.util.concurrent** 是负责在 Java 中定义 Fork/Join 框架的包。java.util.concurrent 包包含各种类和接口,这些类和接口帮助我们在 Java 编程语言中使用并发编程。在并行处理中,处理部分针对同时使用多个处理器进行了优化。当涉及到多线程时,单个 CPU 的空闲时间是基于共享时间进行优化的。通过利用其抽象任务,将大型程序的划分任务包装在 ForkJoinTask 子类中。Fork/Join 子类的两个抽象任务是“**Recursive Task**”和“**RecursiveAction**”。

Fork/Join 框架使用基于分治规则的策略来实现并行处理。在此过程中,一个巨大的任务被分解成小任务,小任务又被分解成更简单的任务。这样,每个任务都被简化为小任务,直到它们足够小以至于可以顺序处理。

Fork/Join 框架的类

  1. **Recursive Task:** 当我们希望从任务中返回结果时,它很有用。例如,在对一个大型数组进行排序时,需要比较每个子任务的结果。这个抽象任务是一个复杂的任务,使得编码更加困难。
  2. **RecursiveAction:** 当我们希望不从程序返回任何结果时,它很有用。例如,如果我们希望用自定义值初始化一个大型数组,那么每个子任务都会独立处理自己的数组部分。需要创建一个新类才能使用 RecursiveAction。
    我们创建的类充当扩展自 java.util.Concurrent.RecursiveAction 的子类。必须实现 RecursiveAction 的新实例才能调用 RecursiveAction。新创建的 RecursiveAction 实例将通过 ForkJoinPool 调用。
  3. **ForkJoinTask:** ForkJoinTask 是一个用于定义任务的抽象类。基本上,可以通过此抽象类的方法 fork() 来创建任务。此任务比使用 Thread 类创建的线程更轻量。
  4. **ForkJoinPool:** ForkJoinPool 类为我们提供了一个公共池,用于执行 ForkJoinTask 的任务。

Fork/Join 框架的方法

  1. **Compute():** 当我们在正确的任务上调用 compute() 方法时,会进行递归调用。
  2. **Fork():** 当使用 fork() 方法时,我们新构造的 PrimeRecursiveAction 将被添加到活动线程的任务列表中。
  3. **Join():** 当我们在一个 forked 任务上调用 join() 方法时,它应该是使用其他方法后的最后几个步骤之一。

让我们看一个示例程序,使用 Java 编程中的 Fork/Join 框架来实现并发编程概念。

实现并发编程的程序

输出

The Initialized Random Values Are :
0.22471.72022.8929 3.4130 4.6356 5.01256.7087 7.1517 8.8097 9.4126 
 The Changed Values Are :
0.2247 1.7202 2.8929 3.4130 4.63565.0125 6.7087 7.15178.8097 9.4126

结论

在本文中,我们涵盖了 Java 编程语言中的并发编程主题以及如何实现它。