Executor Framework Java2025年5月3日 | 阅读 6 分钟 管理工作线程的组件集合,用于高效管理工作线程,被称为 Executor Framework。Executor API 通过 Executors 将任务的执行与实际要执行的任务分离开来。Executor framework 是 生产者-消费者 模式的实现。java.util.concurrent.Executors 类提供了一组用于创建工作线程 ThreadPool 的方法。 要使用 Executor framework,我们必须创建一个线程池来执行任务,并将该任务提交到该线程池。 现在,我们脑海中浮现的问题是,为什么我们需要创建这样的线程池,当我们已经有了 java.lang.Thread 类来创建对象,以及 Runnable/Callable 接口来实现并行性时?那么,创建这样的线程池的原因如下:
Executor 的类型在 Java 中,有不同类型的 executors 可用,如下所示: ![]() 1) SingleThreadExecutorSingleThreadExecutor 是一种特殊的 Executor,它只有一个线程。当我们需要按顺序执行任务时使用它。如果某个线程在执行任务时因某种错误或异常而死亡,则会创建一个新线程,并且所有后续任务都将在该新线程中执行。 2) FixedThreadPool(n)FixedThreadPool 是另一种特殊的 Executor,它是一个具有固定数量线程的线程池。通过这个 Executor,已提交的任务由 n 个线程执行。如果我们要在提交前一个任务后执行更多任务,它们会存储在 LinkedBlockingQueue 中,直到前一个任务完成。n 表示底层处理器支持的线程总数。 3) CachedThreadPoolCachedThreadPool 是一种特殊的线程池,用于执行短暂的并行任务。缓存线程池没有固定数量的线程。当一个新任务到来,而此时所有线程都忙于执行其他任务时,池会创建一个新线程并将其添加到 Executor 中。当一个线程空闲时,它会执行新任务。当线程空闲六十秒后,线程会被终止并从缓存中移除。 4) ScheduledExecutorScheduledExecutor 是我们用于定期运行某个任务的另一种特殊 Executor。当我们需要延迟某个任务时也使用它。 scheduleAtFixedRate 和 scheduleWithFixedDelay 是在 ScheduledExecutor 中用于调度任务的两个方法。scheduleAtFixedRate 方法在上一任务结束后以固定间隔执行任务。scheduleWithFixedDelay 方法在当前任务完成后开始倒计时。这两个方法之间的主要区别在于它们对计划作业连续执行之间延迟的解释。这两个方法都以以下方式使用: 让我们举一个例子来理解 Executor 实际是如何用于执行任务的。我们将创建一个任务,并尝试分别通过简单的 Executor 和 ThreadPoolExecutor 来执行它。 Task1.java SimpleExecutor.java 输出 ![]() 让我们以 ThreadPoolExecutor 为例来理解它与 SimpleExecutor 有何不同。 RejectedExecutionHandlerDemo.java RejectedExecutionHandlerDemo 类用于处理从工作队列中被拒绝的任务。当线程池大小达到限制时,RejectedExecutionHandler 会处理那些无法放入工作线程的任务。我们将按以下方式实现 RejectedExecutionHandler.java 类: NewTask.java 我们创建 NewTask.java 类来创建一个线程,该线程监控 Executor 并在特定时间间隔打印其信息。ThreadPoolExecutor 类中有几种方法可用于获取 Executor 的当前状态、活动线程数、任务数和池大小。我们按以下方式创建监视器线程: ThreadPoolExecutorExample.java 它用于使用 ThreadPoolExecutor 创建线程池。 输出 ![]() 请注意活动线程数、已完成任务数和任务数的变化。shutdown() 方法用于完成所有已提交任务的执行并终止线程池。 下一主题数组中缺失的问题-java |
在 Java 编程世界中,事件驱动的应用程序通常依赖于各种类型的事件来处理用户输入、响应系统事件或执行其他关键任务。Java 提供了一个全面的事件处理框架,包括接口、类和方法来有效管理事件。其中一种...
5 分钟阅读
问题陈述:我们给出了三个字符串 str1、str2、str3。我们需要找到出现在三个给定字符串中顺序相同但不一定连续的最长公共子序列。两个或多个字符串的公共子序列是公共的子序列……
阅读 6 分钟
在本节中,我们将学习什么是 Kynea 数,并创建 Java 程序来计算 Kynea 数。Kynea 数程序经常出现在 Java 编码面试和学术中。Kynea 数是递归定义的数字:F(k) = 4 x F(k...
阅读 6 分钟
Java 中 replace() 和 replaceAll() 的区别 Java String 类提供了各种方法来操作字符串。replace() 和 replaceAll() 方法是其中之一,它们用于将一个字符串替换为指定的子字符串。正如两种方法名称听起来都一样……
阅读 3 分钟
并发是现代软件开发中的一个基本概念,它允许程序同时执行多个任务。Java 是最流行的编程语言之一,为并发编程提供了强大的支持。近年来,结构化并发已成为在...中编写并发代码的一种强大范例。
阅读 6 分钟
移位运算符是一种用于数据位操作的特殊类型运算符。它将第一个操作数的位向左或向右移动。Java 中有以下三种移位运算符:右移运算符 (>>) 左移运算符 (<<) 无符号...
5 分钟阅读
给定两个包含整数的数组。这两个数组都按升序排序。我们的任务是显示这两个排序数组的所有元素,以便所有元素都按升序显示。请注意,使用任何额外的...
14 分钟阅读
什么是 BFS?广度优先搜索 (BFS) 是遍历或搜索树或图数据结构的基本算法。通过将每个节点的邻居添加到从根节点开始的遍历队列中。图的 BFS 与树的 BFS 类似,...
阅读 6 分钟
Java 5 中引入的泛型为开发人员编写和使用 Java 集合的方式带来了革命性的变化。泛型允许类和方法对各种类型的对象进行操作,同时提供编译时类型安全。这一强大功能具有许多优点,有助于编写更清晰、更...
阅读 4 分钟
在本节中,我们将讨论什么是全字母句。我们还将创建一个 Java 程序来检查给定的字符串是否为全字母句。什么是全字母句?如果一个字符串包含从 a 到 z 的所有字母,则称该字符串为全字母句...
5 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India