文章目录
【Java设计模式】扇出扇入模式
一、概述
Java中的扇出扇入设计模式旨在通过将一个任务划分为多个可以并行处理的子任务(扇出),然后将这些子任务的结果合并为一个单一的结果(扇入),来提高并发性和优化处理时间。
二、别名
- 分散收集
三、扇出扇入设计模式的意图
扇出扇入设计模式的目的是在Java中通过并行处理多个子任务并合并结果,来提高并发性能和优化处理效率。
四、通过实际示例详细解释扇出扇入模式
实际示例:
Java中扇出扇入模式的一个现实世界例子是像UberEats或DoorDash这样的食品配送服务。当顾客下单时,服务(扇出)向不同的餐厅发送单独的任务来准备各种菜品。每个餐厅独立工作来准备订单的一部分。一旦所有餐厅完成任务,配送服务(扇入)将来自不同餐厅的菜品聚合为一个订单,确保所有东西一起交付给顾客。这种并行处理提高了效率并确保及时交付。
通俗解释:
扇出扇入模式将任务分布在多个并发进程或线程中,然后聚合结果。
维基百科说:
在面向消息的中间件中,扇出模式通过并行将消息传递到一个或多个目的地,而不等待响应,来模拟信息交换。这允许一个进程同时将任务分配给各种接收器。另一方面,扇入概念通常指的是多个输入的聚合。在数字电子学中,它描述了一个逻辑门可以处理的输入数量。结合这些概念,软件工程中的扇出扇入模式涉及分发任务(扇出),然后聚合结果(扇入)。
五、Java中扇出扇入模式的编程示例
所提供的实现涉及一个数字列表,目标是对它们进行平方并聚合结果。FanOutFanIn
类接收数字列表作为SquareNumberRequest
对象和一个Consumer
实例,该实例在请求完成时收集平方后的结果。每个SquareNumberRequest
以随机延迟对其数字进行平方,并在平方后调用Consumer
。Consumer
实例在不同时间从各个SquareNumberRequest
对象获取结果。
以下是Java中的FanOutFanIn
类,它通过异步分发请求来演示扇出扇入模式。
public class FanOutFanIn {
public static Long fanOutFanIn(final List<SquareNumberRequest> requests, final Consumer consumer) {
ExecutorService service = Executors.newFixedThreadPool(requests.size());
// 扇出
List<CompletableFuture<Void>> futures = requests
.stream()