Java ExecutorService2025年1月11日 | 阅读 8 分钟 Java ExecutorService 是一个接口,它允许我们在线程上异步执行任务。它位于 `java.util.concurrent` 包中。ExecutorService 帮助维护一个线程池并将任务分配给它们。如果任务数量多于可用线程,它还提供了一个设施,可以将任务排队等待,直到有空闲线程可用。 此外,ExecutorService 接口还提供了控制任务执行方式的方法。这些方法包括 `submit(Runnable task)` 和 `submit(Callable<T> task)`,它们提交任务以供执行并返回一个反映任务等待结果的 Future。此外,`shutdown()` 方法可以优雅地终止 ExecutorService,它允许已提交的任务在终止之前完成。 另一种技术 `shutdownNow()` 会立即停止待处理任务的处理,并尝试停止所有当前正在运行的进程。此外,`awaitTermination(long timeout, TimeUnit unit)` 方法会阻塞,直到所有任务在发出 shutdown 请求后执行完毕,或者发生超时,或者当前线程被中断,以先发生的为准。对于 Java 程序,此接口提供了一种灵活有效的方式来同时处理多个任务。 ![]() Java ExecutorService 的方法
ExecutorService Java 程序文件名: ExecutorServiceExample.java 输出 ![]() 解释 在此程序中,我们创建一个具有十个线程的 ExecutorService,并为其分配一个匿名的 Runnable 实现,该实现执行打印 "ExecutorService" 的任务,并在任务完成后关闭 ExecutorService。 如何使用 Java ExecutorService?实例化 ExecutorService 我们可以使用 Java ExecutorService 来创建单个线程、线程池或计划线程池。Executors 类提供了工厂方法来实例化 ExecutorService,如下所示: 为 ExecutorServices 分配任务要为 ExecutorService 分配任务,我们可以使用以下方法:
使用 execute() 方法为 ExecutorService 分配任务的示例 Java ExecutorService 的 execute() 方法接受一个 Runnable 对象并异步执行其任务。调用 execute 方法后,我们调用 shutdown 方法,该方法会阻止其他任务排队到 executorService 中。 文件名: ExecutorServiceExample.java 输出 ExecutorService 解释 此 Java 程序演示了如何使用通过 Executors.newSingleThreadExecutor() 获取的单线程 ExecutorService。创建执行器服务后,使用 execute 方法提交一个由实现 Runnable 接口的匿名内部类表示的任务。在此任务的 run() 方法中,将 "ExecutorService" 打印到控制台。 最后,在提交的任务执行完成后,调用执行器服务的 shutdown 方法以优雅地关闭它。这确保了执行器服务不会接受新任务,并等待现有任务完成后终止。 使用 submit() 方法为 ExecutorService 分配任务的示例 submit() 方法接受一个 Runnable 对象并返回一个 Future 对象。此对象稍后用于检查 Runnable 是否已完成执行。 文件名: ExecutorServiceExample.java 输出 ExecutorService 解释 此 Java 程序使用 Executors.newSingleThreadExecutor() 创建一个单线程的 ExecutorService。然后,它使用 submit 方法向执行器服务提交一个任务,将 "ExecutorService" 打印到控制台。这演示了单线程执行器服务的异步任务执行。 使用 invokeAny() 方法为 ExecutorService 分配任务的示例 invokeAny() 方法接受一个 Callable 对象集合或实现 Callable 的类的对象。此方法返回第一个成功执行的 Callable 对象的 Future 对象。 文件名: ExecutorServiceExample.java 输出 result = Task 1 解释 此 Java 程序以新方式演示了使用通过 Executors 获取的单线程 ExecutorService。它使用 HashSet 生成一组 Callable 任务,每个任务返回一个代表任务的文本。然后将这些任务添加到可调用对象列表中。然后将可调用对象列表传递给 ExecutorService 的 invokeAny 方法,该方法返回一个已完成的单个作业的结果。一旦所有作业都完成执行,结果就会显示在控制台上,最后通过 shutdown 方法对执行器服务进行平滑终止。 使用 invokeAll() 方法为 ExecutorService 分配任务的示例 invokeAll() 方法接受一个包含任务的 Callable 对象集合,并返回一个包含所有任务结果的 Future 对象列表。 文件名: ExecutorServiceExample.java 输出 future.get = Task 1 future.get = Task 3 future.get = Task 2 解释 此 Java 程序以新方式利用通过 Executors 获取的单线程 ExecutorService。它在创建 Callable 任务后将它们添加到集合中。然后将可调用对象集合传递给 ExecutorService 的 invokeAll 方法,该方法返回一个 Future 对象列表,这些对象反映了任务的结果。之后,通过迭代 Future 列表,打印每个任务的输出。最后,当所有作业都完成执行后,通过使用 shutdown 方法对执行器服务进行平滑终止。 如何关闭 ExecutorService?一旦我们完成了分配给 ExecutorService 的任务,我们就必须关闭它,因为 ExecutorService 在不同的线程上执行任务。如果我们不关闭 ExecutorService,线程将继续运行,JVM 将不会关闭。 关闭过程可以通过以下三种方法完成: 1. shutdown() 方法 此方法启动有序关闭,其中将执行先前提交的任务,但不再接受新任务。它允许 ExecutorService 在完成所有已提交任务后优雅地关闭。 2. shutdownNow() 方法 此方法尝试停止所有当前正在执行的任务,停止处理等待中的任务,并返回等待执行的任务列表。它会强制终止 ExecutorService,可能会中断正在进行的任务。 3. awaitTermination() 方法 在收到 shutdown 请求后,阻塞调用线程,直到所有任务都完成执行,或者发生超时,或者当前线程被中断,以先发生的为准。此方法允许调用线程在继续进行其他操作之前等待 ExecutorService 的终止。 下一个主题Java 教程 |
在当今快节奏的软件开发环境中,高效的数据处理至关重要。开发人员经常遇到的一个常见任务是将 JSON(JavaScript 对象表示法)数据转换为 Java 对象。传统上,这个过程涉及手动编码和调试。然而,随着在线工具的出现,开发人员现在拥有方便且...
5 分钟阅读
在 Java 中,每当我们尝试访问数组中不存在索引的任何项时,就会发生这种情况。换句话说,索引可能是负数或超过数组的大小。这是一个子类...
阅读 2 分钟
在 Java 中,double 是一种数据类型。它用于以高精度存储小数。它是一种 64 位 IEEE 754 浮点数据类型,这意味着它可以准确地处理大值和分数。我们经常在科学计算、金融应用和物理学中看到它...
阅读 3 分钟
Java HashMap 默认不保留任何顺序。如果需要对 HashMap 进行排序,我们会根据要求显式排序。Java 提供了根据键和值对 HashMap 进行排序的选项。在本节中,我们将学习如何排序...
阅读 4 分钟
在本节中,我们将学习什么是 Hogben 数,并创建 Java 程序来计算 Hogben 数。Hogben 数程序经常在 Java 编码面试和学术界被问到。Hogben 数 Hogben 数是递归定义的数字:H(n) =...
阅读 3 分钟
Stern-Brocot 序列是一个迷人的数学结构,它源于数论,并提供了一种系统的方法来枚举所有以最简形式表示的正有理数。该序列以 Moritz Stern 和 Achille Brocot 命名,在计算机科学、连分数甚至机械……
阅读 6 分钟
Java 编程是最常用的编程语言之一。在 IT 行业,有超过 800 万 Java 开发人员。Java 开发人员的数量正在迅速增长。学习 Java 并非一蹴而就,需要时间和实践。它...
5 分钟阅读
最初,有许多方法和逻辑可以找到字符串中第一个不重复的字符,只需要实现。要实现,我们需要理解逻辑,并且需要完全掌握编程语言。在通过...使用逻辑实现之前。
7 分钟阅读
这是一个主要的数论问题,可以广泛应用于不同领域,例如密码学和代数。一个数的特定除数是能够整除该数的**所有**素数。实际上,此处要解决的问题包括...
阅读9分钟
在 Java 编程中,“找不到符号”错误意味着编译器无法识别代码中使用的特定标识符,例如变量名或方法名。当您尝试使用未正确声明的变量、方法、类或其他标识符时,会出现此错误...
阅读 10 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India