一、前言
多线程大家肯定都不陌生,可能理论上什么:
Lock、JUC、synchronized
等并发编程知识理论上大家都滚瓜烂熟,但是大家有多少在代码上实践多的呢?在实际开发中我们对于并发编程可能用的最多的可能是:线程池Executor
定义,@Async
做一些异步处理,比如发送消息,但是对于编发编程提效这块最重要的优势很少人去涉及,继上一篇:CompletableFuture实现异步编排全面分析和总结 文章发布,本篇文章主要是想分享一下开发中实际使用来解决多线程并发场景,或许能让帮你多线程并发编程有更深的理解。
二、细数多线程开发好处
毫无疑问,多线程开发可以带来一系列的好处,尤其是在提高系统的并发处理能力,使得系统更具有弹性和响应性,合理的设计和使用多线程,可以提高代码的复用性,减少重复的工作,使得系统更易于扩展和维护,以此,我总结了多线程开发有以下一点好处:
1️⃣ 提高效率: 并行处理允许多个操作同一时间段内独立地进行处理。这加速了整个业务处理过程,使得系统能够同时处理更多的请求,提高了系统的效率。
2️⃣ 任务队列管理: 线程池通常包含一个任务队列,可以缓存待执行的任务。这样可以确保任务按照提交的顺序有序地执行,避免了手动管理线程执行顺序的复杂性。
3️⃣ 降低响应时间: 并行处理允许系统同时处理多个程序逻辑,从而缩短了整体业务的响应时间。对于用户而言,用户的请求能够更迅速地得到响应。
4️⃣ 线程资源充分利用: 在某些情况下,可能会出现大量的任务需要执行,如果每个任务都创建一个新线程,可能导致系统资源耗尽,甚至崩溃。线程池能够限制并发线程的数量,避免线程爆炸的问题。
5️⃣ 提高系统吞吐量: 通过并行处理,系统能够在同一时间段内处理更多的请求,提高了系统的吞吐量,适应高并发的场景。
三、多线程的实现方式
1️⃣ 线程池管理: 使用线程池可以有效地管理和复用线程,避免线程的频繁创建和销毁。线程池能够控制并发度,防止系统资源被耗尽。
2️⃣ 异步处理: 将非核心业务处理过程设计成异步任务,允许系统在后台处理,而不阻塞主线程。这样可以提高系统的响应速度。
3️⃣ 队列系统: 利用消息队列系统,将请求发送到队列中,再由多个消费者并行地处理。这种方式提供了解耦和高并发处理的优势。
4️⃣ 并行算法: 在订单的具体处理逻辑中,采用并行算法来优化性能。例如,并行计算订单的价格、库存检查等。
5️⃣ 请求合并: 对于相似的订单请求,可以合并为一个请求再进行处理,减少并发操作的次数,提高系统的处理效率。
通过综合使用这些方法,业务系统可以更好地实现并行处理,提高系统性能和用户体验。需要根据系统的具体情况选择合适的方案,并注意线程安全和数据一致性。
四、异步处理的应用场景和优势
另外,异步处理 在订单管理系统中的应用是一种重要的优化手段,它可以提高系统的响应速度和整体性能。以下是异步处理在订单管理系统中的一些关键应用场景和优势:
异步应用场景
-
任务拆分与合并: 对于大型任务,可以将其拆分成多个小任务,利用线程池并行执行,提高整体执行效率。
-
订单创建: 在用户提交订单时,可以将订单创建操作设计成异步任务。用户无需等待订单创建的完全处理,而是能够立即获得订单提交成功的提示。
-
支付处理: 支付过程可能涉及第三方支付平台,支付结果的回调通知可以异步处理。系统在接收到支付通知后异步更新订单支付状态。
-
库存检查: 异步处理可以用于订单的库存检查。当用户下单时,系统异步检查商品库存,确保库存充足后再进行订单处理。
-
消息触发通知: 订单状态的通知(如发货通知、取消通知等)可以通过异步任务实现。系统在后台异步发送通知,避免阻塞主线程。
-
数据同步: 异步任务可以用于与其他系统的数据同步,例如与财务系统同步订单金额、与物流系统同步发货信息等。
异步处理的优势
-
提高系统响应速度: 异步处理允许系统在后台进行一些耗时的操作,不影响用户主线程的响应。用户能够更迅速地完成订单提交等操作。
-
降低用户等待时间: 用户不需要长时间等待订单相关操作的完成,异步任务能够让用户更快地得到反馈,提升用户体验。
-
优化资源利用: 异步任务的执行可以充分利用系统的资源,提高系统的并发能力。可以在高峰期处理更多的订单请求。
-
系统解耦: 异步处理可以使系统各个模块解耦,提高系统的可维护性。每个功能模块可以独立地处理自己的异步任务。
-
容错处理: 异步任务的执行独立于主线程,即使某个异步任务执行失败,不会对主线程的执行产生直接影响,提高了系统的容错性。
-
更好的用户体验: 用户在提交订单后能够迅速获得响应,不会因为等待时间过长而导致流程中断,提供更好的用户体验。
在实际应用中,可以使用消息队列、异步框架、定时任务等技术实现异步处理。需要注意异步处理的数据一致性和错误处理机制,确保系统的稳定性。
五、多线程之CompletableFuture
说到多线程开发,不得不说的是CompletableFuture
,在Java
中CompletableFuture
主要是用于异步编程,异步通常意味着非阻塞,可以是我们的发任务单独允许在于主线程分离的其他线程中,并且通过回调可以在主线程中得到任务的执行状态、是否成功、是否异常等信息。
CompletableFuture
类的设计灵感主要来自于Google Guava
的ListenerFutrue
类,它实现了Future
和CompletionStage
接口并且新增了许多方法,支持lambda
,通过回调的方式利用非阻塞方法,实现了一套异步编程模型。通过这种方式,主线程不会被阻塞,因为子线程是另外一条线程在执行,你可以用主线程去并行执行其他任务,使用这种并行的方式,极大的提升了程序的性能表现。
CompletableFuture核心功能
CompletableFuture
核心功能主要体现在它实现的CompletionStage
接口上,如下图所示:
CompletableFuture
实现了 Future
接口和 CompletionStage
。因此 CompletableFuture
是对 Futrue
的功能增强包含了 Future
的功能。从继承的另一个 CompletionStage
接口来实现完成阶段性功能,CompletionStage
接口定义了任务编排的方法,执行某一阶段,可以向下执行后续阶段,自身实现了如下的功能:
转换(thenCompose)
组合(thenCombine)
消费(thenAccept)
执行(thenRun)
带返回的消费(thenApply)
六、多线程业务实战场景
场景1:多线程并行处理C端扫码业务(聚合处理)
以下案例是基于CompletableFutrue.allOf()
方法,将原有的扫码启动业务处理操作改为并行:
场景2:多线程并行处理上游消息
场景3:多线程实现百万excel数据并行插入
这个多线程插入其实就是我上面多线程处理场景中for循环改造的变种,将集合拆分进行并行批量插入:
场景4:多线程实现百万excel数据导出
场景5:多线程异步更新Apollo配置信息
场景6:线程池+@Async异步大数据订单导出
场景7:多线程并行加载APP首页资源信息,提升查询功能
用户登录跳转到APP首页实时请求,服务追求响应时间。比如说用户跳转到首页,需要加载首页banner图资源、用户的通知消息、用户的权益信息、首页的商品、库存等信息,那么我们需要将这一系列的信息聚合起来,展示给用户。
七、总结
面对业务中需要使用到多线程来提升程序的处理效率的场景数不胜数,对于线程池的使用,需要尝试的去追求线程池参数的合理性,合理的利用多线程会带来事半功倍的效果,好了,今天的分享就到此结束了,如果文章对你有所帮助,欢迎 点赞👍+评论💬+收藏❤,我是:austin流川枫,我们下期见!