手撕一个阻塞队列

ops/2024/11/25 13:00:41/

目录

  • 手撕一个阻塞队列
    • 代码
    • 讲解

手撕一个阻塞队列

要手撕一个阻塞队列:就要实现一个普通的队列,加上阻塞,加上锁

代码

java">class MyBlockingQueue{private String[] elems=null;private int tail=0;private int head=0;private int size=0;private Object locker=new Object();public MyBlockingQueue(int capacity){elems=new String[capacity];}public void put(String elem) throws InterruptedException {synchronized (locker){while(size>=elems.length){locker.wait();}elems[tail]=elem;tail++;if(tail>=elems.length){tail=0;}size++;locker.notify();}}public String take() throws InterruptedException {String elem=null;synchronized (locker){while(size==0){locker.wait();}elem=elems[head];size--;if(head>= elems.length){head=0;}size--;locker.notify();}return elem;}
}
public class ThreadDemo29 {public static void main(String[] args) {MyBlockingQueue myBlockingQueue=new MyBlockingQueue(100);Thread t1=new Thread(()->{int n=1;while(true) {try {myBlockingQueue.put(n + " ");System.out.println("生产元素:" + n);n++;} catch (InterruptedException e) {throw new RuntimeException(e);}}});Thread t2=new Thread(()->{while (true){try {String take = myBlockingQueue.take();System.out.println("消费元素:"+take);Thread.sleep(500);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t1.start();t2.start();}
}

在这里插入图片描述

讲解

在这里插入图片描述

在这里插入图片描述

基于这个阻塞队列,就可以写一个简单的生产者消费者模型(最核心的部分是阻塞队列,使用synchronized和wait/notify达到 线程安全 &阻塞)了

实际上,生产者消费者模型,往往是多个生产者多个消费者。

这里的生产者和消费者往往不仅仅是一个线程,也可能是一个独立的服务器程序,甚至是一组服务器程序


http://www.ppmy.cn/ops/136573.html

相关文章

鸿蒙NEXT开发-Navigation组件导航

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

OmniDiskSweeper :一款专为 macOS 设计的磁盘使用分析工具

OmniDiskSweeper 是一款专为 macOS 设计的磁盘使用分析工具,由 The Omni Group 开发。它的主要目的是帮助用户可视化磁盘上的文件和文件夹,并找出占用大量空间的文件,从而帮助用户释放磁盘空间。 OmniDiskSweeper 的特点包括: 简…

【反向迭代器】—— 我与C++的不解之缘(十七)

前言 ​ 在STL中的迭代器部分,之前只关注与正向迭代器,忽视了反向迭代器;现在来看一下反向迭代器到底是个什么东西,以及反向迭代器怎么实现,怎么为之前自己模拟实现的容器增加反向迭代器? 反向迭代器的使用…

windows vscode C++ 简明教程

windows vscode C++ 简明教程 1 安装mingw64 MinGW-w64(Minimalist GNU for Windows 64)是一个开源工具集,用于在 Windows 系统上编译和生成原生的 Windows 应用程序。它是 MinGW 项目的扩展版本,支持 32 位和 64 位 Windows 程序开发。MinGW-w64 提供了 Windows 版的 GN…

归并排序与逆序对问题(C语言版)

一、引言 归并排序是一种高效且稳定的排序方法,而逆序对问题是算法领域的一个经典问题,本文教大家如何实现归并排序,以及如何使用归并排序去结果逆序对问题 二、归并排序 归并排序思想 分解:将待排序的数组分成两半&#xff0c…

windows11下git与 openssl要注意的问题

看了一下自己贴文的历史,有一条重要的忘了写了。 当时帮有位同事配置gitlab,众说周知gitlab是不太好操作。 但我还是自认自己git还是相当熟的。 解决了一系列问题,如配置代理,sshkey,私有库,等等&#xff0…

数据集-目标检测系列- 安全背心 检测数据集 safety_vests >> DataBall

数据集-目标检测系列- 安全背心 检测数据集 safety DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 贵在坚持! 数据样例项目地址: * 相关项目 1)数据集可视化项目:gi…

IDEA2023 SpringBoot整合MyBatis(三)

一、数据库表 CREATE TABLE students (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL,age INT,gender ENUM(Male, Female, Other),email VARCHAR(100) UNIQUE,phone_number VARCHAR(20),address VARCHAR(255),date_of_birth DATE,enrollment_date DATE,cours…