【Java】用Java库中自带的阻塞队列以及用阻塞队列实现生产者-消费者模型

1、阻塞队列(BlockingDeque)

 首先我们来认识一下什么是堵塞队列

阻塞队列即实现了线程安全和阻塞的队列。在队列为空时,获取元素的线程会等待队列存放元素变为非空;在队列满时,存放元素的线程会等待队列取出元素变为不满。

阻塞队列常应用于生产者-消费者模型

我们常用的阻塞队列主要有两类

LinkedBlockingDeque

ArrayBlockingQueue

使用LinkedBlockingDeque

BlockingDeque<Integer> blockingDeque = new LinkedBlockingDeque<>();

使用ArrayBlockingQueue

ArrayBlockingQueue<String> blockingDeque = new ArrayBlockingQueue<>(100);
//100表示队列容量

2、阻塞队列中常用的方法

常用的方法有三个:put(),take(),peek()

put()

put()方法用于在阻塞队列中存放元素

blockingDeque.put(1);

 take()

take()方法用于获取并取出队首元素

System.out.println(blockingDeque.take());

peek()

peek()用于获取队首元素

System.out.println(blockingDeque.peek());

3、用阻塞队列实现生产者-消费者模型

这里我们用LinkedBlockingDeque类

我们用两个线程分别来给阻塞队列添加/取出元素,以此来实现生产者/消费者模型 

import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;public class demo1 {public static void main(String[] args) throws InterruptedException {BlockingDeque<Integer> blockingDeque = new LinkedBlockingDeque<>();Thread thread1 = new Thread(()->{int n = 0;while (true){try {blockingDeque.put(n);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("生产元素"+n);n++;try {Thread.sleep(500);} catch (InterruptedException e) {throw new RuntimeException(e);}}});Thread thread2 = new Thread(()->{while (true){try {System.out.println("消费元素"+blockingDeque.take());} catch (InterruptedException e) {throw new RuntimeException(e);}}});thread1.start();thread2.start();}
}

运行结果

 注意:上面代码中,我们在生产者线程里使用了sleep()休眠,以此来控制生产消费的速度

 

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

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

相关文章

Elasticsearch:FMA 风格的向量相似度计算

作者&#xff1a;Chris Hegarty 在 Lucene 9.7.0 中&#xff0c;我们添加了利用 SIMD 指令执行向量相似性计算的数据并行化的支持。 现在&#xff0c;我们通过使用融合乘加 (Fused Mulitply-Add - FMA) 进一步推动这一点。 什么是 FMA 乘法和加法是一种常见的运算&#xff0c;…

ansible的基本安装

目录 一、简介 1.ansible自动化运维人工运维时代 2.自动化运维时代 3.ansible介绍 4.ansible特点 二、ansible实践 1.环境 2.ansible管理安装 3.ansible被管理安装 4.管理方式 5.添加被管理机器的ip 6.ssh密码认证方式管理 三、配置免密登录 1.ansible自带的密码…

网站被攻击了怎么办,有什么办法防御攻击?

近年来&#xff0c;随着互联网发展&#xff0c;出现了各种各样的网站&#xff0c;web应用&#xff0c;网络极大方便了人们的生活&#xff0c;改变了人们生活方式。而随着网络的发展普及&#xff0c;网络安全问题也困扰着用户。 许多人都曾有过这样经历&#xff0c;网站上线后&…

Pytorch中的tensor维度理解

Pytorch中的tensor维度理解 文章目录 Pytorch中的tensor维度理解摘要打消心理恐惧&#xff0c;从三维学起三维tensor参考文献 摘要 面对pytorch编程中的tensor时&#xff0c;我不时会感到恐惧。对里面数据是怎么排布的&#xff0c;一直没有一个直观的理解。今天我想把这个事情…

微信小程序开发者工具] ? Enable IDE Service (y/N) ESC[27DESC[27C

在HBuilder运行微信小程序开发者工具报错 如何解决 打开微信小程序开发者工具打开设置--->安全设置--->服务器端口选择打开就可以啦

3.11-容器的资源限制

这一小节我们来看一下如何限制容器的资源&#xff0c;比如CPU和内存。 我们先来看一下对内存的限制。 --memory和--memory-swap这两个参数&#xff0c;如果我们只限定了--memory&#xff0c;没有限定--memory-swap&#xff0c;那么--memory-swap的大小就会和--memory大小一样。…

程序员兼职月入30k如何做,快来收藏这21个宝藏平台!

最近经济不太景气&#xff0c;大家都各种方法发展副业收入开源&#xff0c;在某职场论坛上&#xff0c;看到这样一个帖子&#xff1a;某程序员找了3份兼职&#xff0c;晒出自己月入3万的收入&#xff01; 很多网友对此表示羡慕&#xff0c;评论区很多人在问&#xff0c;这个程…

我在Vscode学OpenCV 几何变换(缩放、翻转、仿射变换、透视、重映射)

几何变换指的是将一幅图像映射到另一幅图像内的操作。 cv2.warpAffine&#xff1a;使用仿射变换矩阵对图像进行变换&#xff0c;可以实现平移、缩放和旋转等操作。cv2.warpPerspective&#xff1a;使用透视变换矩阵对图像进行透视变换&#xff0c;可以实现镜头校正、图像纠偏等…

元素的点击操作

元素的点击操作 .click 语法 // 单击某个元素 .click()// 带参数的单击 .click(options)// 在某个位置点击 .click(position)// 在某个位置点击&#xff0c;且带参数 .click(position, options)// 根据页面坐标点击 .click(x, y)// 根据页面坐标点击&#xff0c;且带参数 .c…

区间第k小数 (可持久化线段树、主席树)

题意&#xff1a;多次询问&#xff0c;每次询问某区间的第k小数。 可持久化线段树&#xff1a; 掺杂了一点前缀和的思想&#xff0c;对于每一个1 ~ i 的区间都建一个树&#xff0c;每个节点存的都是一个线段树&#xff0c;值存的是当前区间中初始数组按大小排序后[l, r]之间的…

前缀和的动态维护——树状数组[C/C++]

文章目录 前言lowbitlowbit的定义lowbit的计算 树状数组的思想树状数组的操作单点修改 update前缀查询 query树状数组的建立 build 前言 树状数组巧妙了利用位运算和树形结构实现了允许单点修改的情况下&#xff0c;动态维护前缀和&#xff0c;并且实现单点修改和前缀和查询的效…

如何用CHAT分析网络流行语的构成特点及趋势?

问CHAT&#xff1a;请分析下网络流行语的构成特点及趋势 CHAT回复&#xff1a; 网络流行语的构成特点&#xff1a; 1. 新颖性&#xff1a;网络流行语象征着新潮的概念、思想和观点&#xff0c;它们新颖独特且易于传播。 2. 深入人心的设定&#xff1a;网络流行语通常是由大众…