Java中的任务分发与并行处理:Executor与CompletableFuture的最佳实践

Java中的任务分发与并行处理:Executor与CompletableFuture的最佳实践

大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!

在现代Java开发中,任务分发与并行处理是提高应用性能和响应速度的关键技术。Java提供了多种方式来实现并发处理,其中Executor框架和CompletableFuture是两种主要的工具。本文将探讨这两种工具的最佳实践,帮助你在实际项目中高效地管理任务。

一、Executor框架概述

Executor框架是Java提供的用于处理并发任务的基础设施。它简化了线程管理,提供了任务调度、线程池等功能。Executor框架主要包含以下几个接口:

  • Executor:最基本的接口,提供了一个方法void execute(Runnable command)用于提交任务。
  • ExecutorService:扩展了Executor接口,提供了更多的功能,如任务的提交和结果获取。
  • ScheduledExecutorService:继承自ExecutorService,提供了任务调度的功能。
1. 使用Executor框架

下面是一个使用ExecutorService来管理线程池并执行任务的示例:

package cn.juwatech.executor;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ExecutorExample {public static void main(String[] args) {// 创建一个固定大小的线程池ExecutorService executor = Executors.newFixedThreadPool(4);// 提交多个任务for (int i = 0; i < 10; i++) {final int taskId = i;executor.submit(() -> {System.out.println("Task " + taskId + " is running in " + Thread.currentThread().getName());try {Thread.sleep(1000); // 模拟任务执行} catch (InterruptedException e) {e.printStackTrace();}});}// 关闭线程池executor.shutdown();}
}

代码解析:

  1. 使用Executors.newFixedThreadPool(4)创建一个固定大小的线程池,最多同时运行4个线程。
  2. 提交多个任务到线程池,这些任务会在不同的线程中并发执行。
  3. executor.shutdown()用于关闭线程池,等待所有任务完成后退出。
2. Executor的优化
  • 线程池大小: 根据系统负载和任务特性合理配置线程池大小。可以使用Executors.newCachedThreadPool()创建一个可以根据需要创建新线程的线程池,适合任务负载不均的场景。
  • 任务队列: 选择合适的任务队列实现,ArrayBlockingQueue适合任务数量固定的场景,而LinkedBlockingQueue适合任务数量不确定的场景。
  • 拒绝策略: 配置合适的任务拒绝策略,如ThreadPoolExecutor.AbortPolicyThreadPoolExecutor.CallerRunsPolicy等,以应对任务提交过多的情况。

二、CompletableFuture概述

CompletableFuture是Java 8引入的一个类,提供了更强大的异步编程能力。它支持将异步任务链式调用,处理复杂的异步计算和任务组合。

1. 使用CompletableFuture

以下是一个基本的CompletableFuture示例,演示了如何异步处理任务:

package cn.juwatech.completablefuture;import java.util.concurrent.CompletableFuture;public class CompletableFutureExample {public static void main(String[] args) {// 创建一个异步任务CompletableFuture.supplyAsync(() -> {System.out.println("Task is running in " + Thread.currentThread().getName());try {Thread.sleep(1000); // 模拟任务执行} catch (InterruptedException e) {e.printStackTrace();}return "Result";}).thenAccept(result -> {System.out.println("Received result: " + result);});// 等待异步任务完成try {Thread.sleep(2000); // 等待足够的时间以确保异步任务完成} catch (InterruptedException e) {e.printStackTrace();}}
}

代码解析:

  1. CompletableFuture.supplyAsync创建一个异步任务,该任务在独立线程中执行。
  2. thenAccept方法指定了任务完成后的处理逻辑,这里我们打印出结果。
  3. 主线程通过Thread.sleep等待异步任务完成。
2. CompletableFuture的优化
  • 任务链式调用: 使用thenApplythenCombine等方法链式调用多个异步任务,以实现复杂的异步计算。
  • 异常处理: 使用exceptionallyhandle方法处理任务执行过程中发生的异常,确保任务的可靠性。
  • 等待多个任务: 使用allOfanyOf方法等待多个CompletableFuture完成,以便在所有任务完成后进行后续处理。

三、Executor与CompletableFuture的比较与选择

Executor框架和CompletableFuture各自有其特点和应用场景:

  • Executor: 适用于需要显式管理线程池、任务调度的场景。对于复杂的线程管理和任务调度,Executor提供了更多的控制权。
  • CompletableFuture: 适用于需要进行异步编程、任务链式处理的场景。它简化了异步编程的复杂性,并提供了强大的任务组合和异常处理功能。

四、最佳实践

  1. 任务管理: 使用Executor管理并发任务时,合理配置线程池和任务队列,确保系统的高效运行。
  2. 异步编程: 使用CompletableFuture进行异步编程时,利用任务链式调用和异常处理提高代码的可读性和可靠性。
  3. 混合使用: 在实际应用中,可以根据需要混合使用ExecutorCompletableFuture,如使用Executor管理线程池,同时使用CompletableFuture处理异步任务。

结语

在Java中,合理使用ExecutorCompletableFuture可以显著提高任务分发与并行处理的效率。通过理解它们的特点和最佳实践,你可以在不同的应用场景中选择合适的工具,实现高效的并发处理。希望本文的示例和优化建议能帮助你更好地管理任务和提高应用性能。

本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147477.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

局域网设备自动发现常用方法

文章目录 需求实现方法ARP (Address Resolution Protocol)Ping ip的流程抓包如下代码实现 mDNS 对比测试Avahi 介绍Avahi 安装Avahi 使用测试代码 需求 局域网设备自动发现是软件开发中的一个常见且重要的需求&#xff0c;它简化了设备间的协作机制&#xff0c;降低了软件各模…

MySQL内存(Buffer Pool)

Buffer Pool MySQL 的数据存在磁盘&#xff0c;但是不能每次读取数据都从磁盘里去&#xff0c;这样磁盘IO太频繁&#xff0c;存在性能问题。 InnoDB设计了一个缓存池&#xff08;Buffer Pool&#xff09;&#xff0c;缓冲池在内存中。 默认配置Buffer Pool大小为128MB&#xf…

Trapezoidal Decomposition梯形分解算法(TCD)

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言Trapezoidal Decomposition梯形分解算法&#xff08;TCD&#xff09;原理&#xff08;1&#xff09;第一种原理&#xff08;2…

DataX实战:从MongoDB到MySQL的数据迁移--修改源码并测试打包

在现代数据驱动的业务环境中&#xff0c;数据迁移和集成是常见的需求。DataX&#xff0c;作为阿里云开源的数据集成工具&#xff0c;提供了强大的数据同步能力&#xff0c;支持多种数据源和目标端。本文将介绍如何使用DataX将数据从MongoDB迁移到MySQL。 环境准备 安装MongoDB…

智慧医院人工智能应用场景 | 智能导诊系统源码

近年来&#xff0c;智能医疗在国内外的发展热度不断提升。图像识别、深度学习、神经网络、大模型、语音等关键技术的突破带来了人工智能技术新一轮的发展。 场景一&#xff1a;智能机器人 医疗机器人是指能够在医疗领域执行特定任务或功能的机器人&#xff0c;包括手术机器人、…

【LLaMa2入门】从零开始训练LLaMa2

目录 1 背景2 搭建环境2.1 硬件配置2.2 搭建虚拟环境2.2.1 创建虚拟环境2.2.2 安装所需的库 3 准备工作3.1 下载GitHub代码3.2 下载模型3.3 数据处理3.3.1 下载数据3.3.2 数据集tokenize预处理 4 训练4.1 修改配置4.2 开始训练4.3 多机多卡训练 5 模型推理5.1 编译5.1.1 安装gc…

Java算法专栏

专栏导读 在当今这个技术日新月异的时代&#xff0c;Java算法作为软件开发的核心&#xff0c;对于提升程序性能和解决复杂问题至关重要。本“Java算法”专栏旨在帮助读者深入理解Java编程语言中的算法原理和应用&#xff0c;通过实战案例和深入分析&#xff0c;使读者能够掌握…

软媒市场新探索:软文媒体自助发布,开启自助发稿新篇章

在繁华喧嚣的软媒市场中,每一个声音都在竭力呼喊,每一个品牌都在奋力展现。而软文,作为一种温柔而坚韧的营销力量,正逐渐崭露头角。特别是软文媒体自助发布平台的出现,更是为企业提供了一个全新的、高效的自助发稿渠道。 软媒市场自助发布平台,正如其名,是一个让企业能够自主发…

【LeetCode】每日一题 2024_9_21 边积分最高的节点(哈希)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;边积分最高的节点 代码与解题思路 func edgeScore(edges []int) (ans int) {// 直接维护哈希最大值即可mp : map[int]int{}for i, v : range edges {mp[v] i// 如果多个节点的 边积分 相…

【数据库】常用数据库简介

目录 &#x1f354; 常用的关系型数据库 &#x1f354; Mysql简介 &#x1f354; SQL 简介 SQL语句的分类 SQL 写法 SQL 常用的数据类型 &#x1f354; DDL语句 对数据库的操作 对数据表的操作 &#x1f354; DML语句 插入数据 insert into 修改数据 update 删除数…

Ubuntu下使用 python搭建服务实现从web端远程配置设备网口

1、通过文件配置Ubuntu设备网口 在Ubuntu工控机上&#xff0c;通过文件配置网口&#xff08;网络接口&#xff09;可以让网络配置在每次系统启动时自动生效。以下是常见的方法步骤&#xff1a; 1.1 使用 netplan 配置网口&#xff08;Ubuntu 18.04 及以上版本&#xff09; 编…

探索微软Copilot Agents:如何通过Wave 2 AI彻底改变工作方式

微软在最近的Copilot Wave 2发布会上&#xff0c;展示了一系列将彻底改变日常工作流程的新AI功能&#xff0c;尤其是 Copilot Agents&#xff0c;它们不仅仅是简单的工具&#xff0c;而是真正的工作助理&#xff0c;可以自动完成任务、提供智能分析并帮助你做出决策。这些新功能…

Day6:反转链表

题目&#xff1a;给你单链表的头节点head&#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 输入&#xff1a;head[1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] public ListNode reverseList() {if (head null) {return head;}ListNode cur head.next;head.next null…

Python脚本每日自动备份MySQL数据库,无需mysqldump

编写一个Python脚本&#xff0c;每天凌晨3点开始备份 脚本具有以下特点 不需要安装mysql-client&#xff0c;并且Windows Linux都可以使用支持多个数据库连接的备份每个数据库支持多个表备份日志保存下来&#xff0c;方便第二天早上查看备份结果 首先安装需要的库 pip3 ins…

调节 PWM的占空比控制舵机的角度

一、PWM工作原理 让计数器从0数到自动重装载值&#xff0c;不停计数。计数值小于输出比较寄存器时输出一种电平&#xff0c;大于输出比较寄存器时使出另一种电平。 修改定时器时钟源的速度以及预分频器等设置&#xff0c;可以修改计数器计数的速度 再加上修改自动重装载值&…

肺结节检测系统源码分享

肺结节检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Visio…

python画图|图像背景颜色设置

python画图出来的默认图形背景是白色&#xff0c;有时候并不适合大家表达想要表达的意思。 因此&#xff0c;我们很有必要掌握自己设置图形背景颜色的技巧。 【1】官网教程 首先请各位看官移步官网&#xff0c;看看官网如何设置&#xff0c;下述链接可轻松到达&#xff1a; …

如何将很多个pdf拼接在一起?很多种PDF拼接的方法

如何将很多个pdf拼接在一起&#xff1f;将多个PDF文件合并不仅能够提升信息的整合性&#xff0c;还能使文件管理更加高效。想象一下&#xff0c;你需要向同事或老师提交一份综合报告&#xff0c;其中包含了多份相关资料。如果每个文件单独存在&#xff0c;查找和传输都会变得繁…

IDEA中Quarkus框架(3.13版本)开发、调试、部署、打包等

code-with-quarkus code-with-quarkus 是使用官网生成的demo项目 这个项目使用Quarkus&#xff08;使用3.13.0版本&#xff0c;该版本支持JDK21&#xff09;&#xff0c;超音速亚原子Java框架。官网地址: https://quarkus.io/. 环境要求 OS: Windows 10.0 jdk 11 maven 3.9…

2024年研赛-华为杯数模竞赛F题论文首发+论文讲解

本届研赛助攻题目 C D F三题论文均已经全部完成。后更新计划 如图所示。 免费给大家分享 三个问题的论文部分代码 2024年华为杯-研赛分享资料&#xff08;论文部分代码&#xff09;&#xff08;已更新部分代码&#xff09;&#xff1a; 链接&#xff1a;https://pan.baidu.com…