首页 > 其他分享 >CompletableFuture + LinkedBlockingDeque 实现生产者消费者案例

CompletableFuture + LinkedBlockingDeque 实现生产者消费者案例

时间:2023-12-13 17:37:20浏览次数:35  
标签:LinkedBlockingDeque 生产者 System 案例 CompletableFuture println out

设计要求:

1. 设计一个生产者生产,消费者消费场景;

2. 使用线程池 CompletableFuture + 队列LinkedBlockingDeque 实现;

3. 生产者生产的数据存储到长度为5的 LinkedBlockingDeque 队列,消费者消费从 LinkedBlockingDeque 队列中取数据;

4. 生产者和消费者均是多线程且不知道谁快谁慢,互不干扰;

5. 消费者根据生产者情况进行结束

以下为模板案例代码,可以封装成工具类使用:

 1 package com.xx.product.manage.service;
 2 
 3 import java.util.concurrent.*;
 4 import java.util.concurrent.atomic.AtomicBoolean;
 5 
 6 public class ProducerConsumerExample {
 7     public static void main(String[] args) {
 8 
 9         LinkedBlockingDeque<Integer>  queue = new LinkedBlockingDeque<>(5);
10         Executor executor = Executors.newFixedThreadPool(2);
11 
12         AtomicBoolean producerFinished = new AtomicBoolean(false);
13 
14         CompletableFuture <Void> producerFuture = CompletableFuture.runAsync(() ->  {
15             try {
16                 for (int i = 1; i <= 10; i++) {
17                     // 生产数据
18                     System.out.println("Producing: " + i);
19 //                    Thread.sleep(3000); //验证 消费者速度 > 生产者速度
20                     queue.put(i);
21 
22                     // 如果队列已满,等待消费者消费数据
23                     if (queue.size() == 5) {
24                         System.out.println("Queue is full. Waiting for consumer...");
25                     }
26                 }
27             } catch (InterruptedException e) {
28                 e.printStackTrace();
29             }
30 
31             // 生产者结束
32             producerFinished.set(true);
33             System.out.println("Producer finished.");
34         }, executor);
35 
36         CompletableFuture <Void>  consumerFuture = CompletableFuture.runAsync(() ->  {
37             try {
38                 while (true) {
39                     // 如果队列为空且生产者已结束,则消费者退出循环
40                     if (queue.isEmpty() && producerFinished.get()) {
41                         break;
42                     }
43 
44                     // 消费数据
45 //                    Thread.sleep(2000); //验证生产者速度 > 消费者速度
46                     Integer item = queue.take();
47                     if (item != null) {
48                         System.out.println("Consuming: " + item);
49                     } else {
50                         // 如果队列为空,等待生产者生产数据
51                         System.out.println("Queue is empty. Waiting for producer...");
52                         Thread.sleep(1000);
53                     }
54                 }
55             } catch (InterruptedException e) {
56                 e.printStackTrace();
57             }
58 
59             System.out.println("Consumer finished.");
60         }, executor);
61 
62         // 等待生产者和消费者都完成
63         CompletableFuture.allOf(producerFuture, consumerFuture).join();
64         System.out.println("All tasks finished.");
65 
66         // 关闭线程池
67         ((ExecutorService) executor).shutdown();
68     }
69 }

 知识点:

 

标签:LinkedBlockingDeque,生产者,System,案例,CompletableFuture,println,out
From: https://www.cnblogs.com/singleYao/p/17899492.html

相关文章

  • 【Python爬虫】Scrapy框架图片下载_桌面壁纸ZOL(纯案例)
    Spider代码classBizhizolSpider(scrapy.Spider):name="bizhizol"allowed_domains=["zol.com.cn"]start_urls=["https://desk.zol.com.cn/youxi/"]defparse(self,response,**kwargs):#print(response.te......
  • 关于C#反射概念,附带案例!
    反射C#中的反射是一种使程序在运行时能够动态地获取类型信息并调用其成员的技术。通过反射,程序可以在运行时进行类型的动态加载、创建对象、调用方法和属性,以及访问和修改字段等。反射可以使程序更加灵活,但也增加了一定的性能开销。在C#中,反射主要是通过System.Reflection命名空......
  • 大语言模型LLM的核心技术及应用场景案例的分析
    LLM的核心技术:自注意力机制(Self-Attention)是LLM中的关键组成部分。它允许模型在不同输入序列元素之间分配不同的权重,通过计算查询(Query)、键(Key)和值(Value)之间的相互关系,以便更好地捕捉长距离依赖关系。例如,在处理一段对话时,自注意力机制能帮助模型理解哪些词汇是关键信息,哪些是上下......
  • 大语言模型LLM的核心技术及应用场景案例的分析
     LLM的核心技术:自注意力机制(Self-Attention)是LLM中的关键组成部分。它允许模型在不同输入序列元素之间分配不同的权重,通过计算查询(Query)、键(Key)和值(Value)之间的相互关系,以便更好地捕捉长距离依赖关系。例如,在处理一段对话时,自注意力机制能帮助模型理解哪些词汇是关键信息,哪些......
  • 开发案例:使用canvas实现图表系列之折线图
     一、功能结构实现一个公共组件的时候,首先分析一下大概的实现结构以及开发思路,方便我们少走弯路,也可以使组件更加容易拓展,维护性更强。然后我会把功能逐个拆开来讲,这样大家才能学习到更详细的内容。下面简单阐述下折线图组件的功能结构:以上是基础的功能结构框架,包含一些比......
  • Python各种奇奇怪怪的写法以及常用案例
    工具类common#####工具类commonimportrequestsimporttimeimportjsonimportrandomimportosfromlxmlimportetreeimportconcurrent.futuresfromurllib.parseimportunquote,quotefromPILimportImagedefstrClear_v1(str):try:returnst......
  • 关于C#接口的用法详细解答,附上案例说明!
    接口C#中的接口是一种定义了一组方法、属性和事件的类型。它只包含成员的声明,而不包含任何实现。接口可以被类通过实现的方式使用,从而使类能够具有接口定义的行为。接口在C#中被定义为使用interface关键字,接口的成员默认是公共的。类通过使用implements关键字实现接口,并提供接口......
  • 逃逸分析案例
    1.函数返回局部指针变量funcAdd(x,yint)*int{res:=0res=x+yreturn&res}funcmain(){Add(1,2)}函数返回局部变量是一个指针变量,该函数执行结束,对应栈帧就会销毁,但是引用返回到函数外部,如果外部解析地址,就会导致程序访问非法内存,所以经过编辑器分析过后......
  • CompletableFuture
    目录常用API创建异步任务获取任务结果异步回调处理【回调方法】有入参,有返回值有入参,无返回值无入参,无返回值异常可传递【有参、无返回】异常可传递【有参、有返回】多任务组合处理A、B任务均执行完才能执行CA、B任意一个执行完立马执行CN个任务执行完毕执行某个任务常用API创建......
  • 数仓调优实践丨多次关联发散导致数据爆炸案例分析改写
    本文分享自华为云社区《GaussDB(DWS)性能调优:求字段全体值中大于本行值的最小值——多次关联发散导致数据爆炸案例分析改写》,作者:Zawami。1、【问题描述】 语句中存在同一个表多次自关联,且均为发散关联,数据爆炸导致性能瓶颈。2、【原始SQL】explainverboseWITHTMPAS......