【多线程与高并发】-Java如何实现一个阻塞队列呢?
发布日期:2021-06-29 15:36:25
浏览次数:3
分类:技术文章
本文共 1529 字,大约阅读时间需要 5 分钟。
【多线程与高并发】-Java如何实现一个阻塞队列呢?
Java要想实现一个阻塞队列,首先要明确阻塞队列的主要功能是什么:
- 队列的先进先出的功能;
- 队列的满的时候 放入的时候需要被阻塞;
- 队列为空的时候 取的时候需要被阻塞;
那么要想实现一个阻塞队列,我们需要两个锁,以及wait和notify来实现通信,并且通过getIndex和putIndex来实现。
// 阻塞队列public final class ArrayQueue{ // 队列数量 private int count = 0; // 最终的数据存储 private Object[] items; // 队列满时的阻塞锁 private Object full = new Object(); // 队列空时的阻塞锁 private Object empty = new Object(); //写入数据时的下标 private int putIndex; // 获取数据时的下标 private int getIndex; // 初始化 public ArrayQueue(int size) { items = new Object[size]; } // 获取大小 public int size() { return count; } /** * put方法 从队列尾写入数据 */ public void put(T t) { // 数据满的情况下 synchronized (full) { while(count==items.length) { try { // 满了的情况下等待 full.wait(); }catch (InterruptedException e) { // TODO: handle exception break; } } } // 数据空的情况下 synchronized (empty) { // 写入 items[putIndex++] = t; count++; // 查看是否到尾巴了 if(putIndex==items.length) { // 超过数组长度后需要从头开始 putIndex=0; } // 有数据了唤醒 empty.notify(); } } // 从队列头获取数据 public T get() { // 如果是空的情况 synchronized (empty) { while(count==0) { try { empty.wait(); }catch (InterruptedException e) { // TODO: handle exception return null; } } } // 如果是满的情况下 synchronized (full) { Object result = items[getIndex]; items[getIndex] = null; getIndex++; count--; if(getIndex==items.length) { getIndex=0; } // 唤醒线程 full.notify(); return (T)result; } } }
转载地址:https://codingchaozhang.blog.csdn.net/article/details/115801858 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2024年04月07日 13时27分17秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
复合材料生活中的应用
2019-04-29
ABAQUS复合材料(适合小白)
2019-04-29
ABAQUS高级案例解析
2019-04-29
人工智能药物研发
2019-04-29
【超级干货+福利】AIDD最全面的学习教程
2019-04-29
最新通知:AIDD与网络药理学资料大全
2019-04-29
Lammps分子动力学与第一性原理材料模拟及催化
2019-04-29
实习生小白的日常
2019-04-29
实习小白的日常(4)
2019-04-29
微信扫码登录验证PHP代码(不用开放平台)
2019-04-29
CH554E USB单片机 10引脚小封装低成本USB方案
2019-04-29
windows MQTT客户端
2019-04-29
LINUX下挂载(mount)查看树莓派镜像文件
2019-04-29
基于CH568芯片加密SD卡方案
2019-04-29
1元钱的超低成本单芯片USB单片机方案
2019-04-29
单片机/树莓派扩展双串口(TTL和RS485)
2019-04-29
JAVA(android)提取WIFI客流探针MAC地址源码
2019-04-29
基于CH568芯片的SATA电子盘方案
2019-04-29
linux下C语言判断网络是否连接
2019-04-29