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.rhkb.cn/news/429150.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java面试篇-AOP专题(什么是AOP、AOP的几个核心概念、AOP的常用场景、使用AOP记录操作日志、Spring中的事务是如何实现的)

文章目录 1. 什么是AOP2. AOP的几个核心概念3. AOP的常用场景4. 使用AOP记录操作日志4.1 准备工作4.1.1 引入Maven依赖4.1.2 UserController.java4.1.3 User.java4.1.4 UserService.java 4.2 具体实现&#xff08;以根据id查询用户信息为例&#xff09;4.2.1 定义切面类&#x…

SkyWalking 环境搭建部署

架构简介 skywalking agent : 和业务系统绑定在一起,负责收集各种监控数据skywalking oapservice : 是负责处理监控数据的,比如接受skywalking agent的监控数据,并存储在数据库中;接受skywalking webapp的前端请求,从数据库查询数据,并返回数据给前端。Skywalking oapserv…

华为HarmonyOS地图服务 7- 在地图上绘制标记

场景介绍 本章节将向您介绍如何在地图的指定位置添加标记以标识位置、商家、建筑等。 点标记用来在地图上标记任何位置,例如用户位置、车辆位置、店铺位置等一切带有位置属性的事物。Map Kit提供的点标记功能(又称 Marker)封装了大量的触发事件,例如点击事件、长按事件、…

【RabbitMQ】消息分发、事务

消息分发 概念 RabbitMQ队列拥有多个消费者时&#xff0c;队列会把收到的消息分派给不同的消费者。每条消息只会发送给订阅该队列订阅列表里的一个消费者。这种方式非常适合扩展&#xff0c;如果现在负载加重&#xff0c;那么只需要创建更多的消费者来消费处理消息即可。 默…

linux网络编程5

24.9.21学习目录 一.TCP1.TCP流程2.TCP相关函数3.三次握手 一.TCP 1.TCP流程 服务器流程&#xff1a; 创建套接字socket&#xff08;&#xff09;将套接字与服务器网络信息结构体绑定bind&#xff08;&#xff09;将套接字设置为监听状态listen&#xff08;&#xff09;阻塞等…

进程间的通信4 共享内存

共享内存 1.共享内存简介 共享内存是将分配的物理空间直接映射到进程的用户虚拟地址空间中&#xff0c;减少数据在内核空间缓存共享内存是一种效率较高的进程间通讯的方式在 Linux 系统中通过 ipcs -m 查看所有的共享内存 共享内存模型图 2.共享内存的创建 1.函数头文件 #…

Java算法专栏

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

Java汽车销售管理

技术架构&#xff1a; springboot mybatis Mysql5.7 vue2 npm node 功能描述&#xff1a; 针对汽车销售提供客户信息、车辆信息、订单信息、销售人员管理、财务报表等功能&#xff0c;提供经理和销售两种角色进行管理 效果图&#xff1a;

Python基础学习(3)

目录 一&#xff0c;函数 1&#xff0c;函数的定义 2&#xff0c;函数的参数 1&#xff0c;默认值 2&#xff0c;传参 3&#xff0c;返回值 4&#xff0c;变量的作用域 5&#xff0c;函数的调用 二&#xff0c;常用数据结构 1&#xff0c;列表 列表的定义 列表的特性…

【Geoserver使用】REST API调用(工作空间部分)

文章目录 前言一、Geoserver REST API(GeoServer Workspace)二、GeoServer Workspace接口使用1.GET请求 /workspaces2.POST请求 /workspaces3.GET请求 /workspaces/{workspaceName}4.PUT /workspaces/{workspaceName}5.DELETE /workspaces/{workspaceName} 总结 前言 根据Geos…

C++ | Leetcode C++题解之第423题从英文中重建数字

题目&#xff1a; 题解&#xff1a; class Solution { public:string originalDigits(string s) {unordered_map<char, int> c;for (char ch: s) {c[ch];}vector<int> cnt(10);cnt[0] c[z];cnt[2] c[w];cnt[4] c[u];cnt[6] c[x];cnt[8] c[g];cnt[3] c[h] - …

YOLOv10 简介

YOLOv10&#xff0c;由清华大学的研究人员基于 Ultralytics Python 包构建&#xff0c;引入了一种全新的实时目标检测方法&#xff0c;该方法解决了以往 YOLO 版本中后处理和模型架构方面的不足。通过消除非极大值抑制&#xff08;NMS&#xff09;并优化各种模型组件&#xff0…

【解决】chrome 谷歌浏览器,鼠标点击任何区域都是 Input 输入框的状态,能看到输入的光标

chrome 谷歌浏览器&#xff0c;鼠标点击任何区域都是 Input 输入框的状态&#xff0c;能看到输入的光标 今天打开电脑的时候&#xff0c;网页中任何文本的地方&#xff0c;只要鼠标点击&#xff0c;就会出现一个输入的光标&#xff0c;无论在哪个站点哪个页面都是如此。 我知道…

十四、运算放大电路

运算放大电路 1、理想运算放大器的概念。运放的输入端虚拟短路、虚拟断路之间的区别; 2、反相输入方式的运放电路的主要用途&#xff0c;以及输入电压与输出电压信号的相位 3、同相输入方式下的增益表达式(输入阻抗、输出阻抗)

Redis-01 入门和十大数据类型

Redis支持两种持久化方式&#xff1a;RDB持久化和AOF持久化。 1.RDB持久化是将Redis的数据以快照的形式保存在磁盘上&#xff0c;可以手动触发或通过配置文件设置定时触发。RDB保存的是Redis在某个时间点上的数据快照&#xff0c;可以通过恢复RDB文件来恢复数据。 2.AOF持久化…

55. QTableWidget的基本使用

1. 说明 在软件界面开发中,基本上离不开数据的展示以供客户查看一些比较关注的信息,比如公司做一个员工个人信息管理系统,需要一个界面能够展示员工个人基本信息,实现这种效果可以采用多种形式,其中比较简单的一种是使用QT提供的QTableWidget控件,这个控件已经封装了一些…

LeetCode 面试经典150题 190.颠倒二进制位

复习知识&#xff1a;正数的原码、反码、补码相同&#xff0c;负数的反码在其原码的基础上, 符号位不变&#xff0c;其余各个位取反&#xff0c;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后1 (即在反码的基础上1)。 题目&#xff1a;颠倒给定的 32 位无符号…

Springboot3 + MyBatis-Plus + MySql + Uniapp 商品加入购物车功能实现(最新教程附源码)

Springboot3 MyBatis-Plus MySql Uniapp 商品加入购物车功能实现&#xff08;针对上一篇sku&#xff09; 1、效果展示2、后端代码2.1 model2.2 mapper server serverImpl 参照上一篇自动生成2.3 controller 3、前端代码3.1 index.js3.2 shop-info.vue3.3 ShopBottomButton.v…

计算机毕业设计hadoop+spark+hive新能源汽车销售数据分析系统 二手车销量分析 新能源汽车推荐系统 可视化大屏 汽车爬虫 机器学习

《HadoopSparkHive新能源汽车销售数据分析系统》开题报告 一、选题背景与意义 1.1 选题背景 随着全球对环境保护意识的增强和能源结构的转型&#xff0c;新能源汽车市场迅速崛起。新能源汽车的销售数据不仅反映了市场趋势和消费者偏好&#xff0c;还为企业决策、政府监管和政…

【玉米田】

题目 代码 #include <bits/stdc.h> using namespace std; typedef long long LL;const int mod 1e8; const int M 1 << 12; LL f[13][M]; int g[13]; vector<int> state; vector<int> p[M]; int n, m; bool check(int x) {return !(x & x <&…