【多线程与高并发】-Java如何实现一个阻塞队列呢?
发布日期:2021-06-29 15:36:25 浏览次数:2 分类:技术文章

本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【多线程高并发】-Java使用阻塞队列ArrayBlockingQueue实现生产者消费者模式?
下一篇:【Leetcode优先级队列】-合并K个升序链表

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月29日 17时08分33秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

PID算法搞不懂?看这篇文章就够了。 2019-04-29
这位电子工程师,你不能错过。 2019-04-29
十八般武艺教你如何解决问题 2019-04-29
「权威发布」2019年大学生电子设计竞赛,仪器设备和主要元器件清单 2019-04-29
「重磅猜题之第二篇」2019年大学生电子设计竞赛 2019-04-29
知乎:硬件和软件哪个吃香? 2019-04-29
中国深圳,600架无人机的盛典! 2019-04-29
干货分享 JVM 之第 3 篇 —— Java 内存结构相关 2019-04-29
干货分享 JVM 之第 4 篇 —— 掌握 Jmeter 压力测试工具,熟悉 Jconsole.exe 工具 2019-04-29
干货分享 JVM 之第 5 篇 —— 类加载器 2019-04-29
干货分享 JVM 之第 6 篇 —— SpringBoot2.0 框架性能调优 2019-04-29
基于 Hystrix 高并发服务限流第 1 篇 —— 必须了解的相关概念 2019-04-29
基于 Hystrix 高并发服务限流第 2 篇 —— 服务隔离(线程池隔离、信号量隔离) 2019-04-29
基于 Hystrix 高并发服务限流第 3 篇 —— 服务熔断、服务降级 2019-04-29
基于 Hystrix 高并发服务限流第 4 篇 —— 基于 Feign 实现服务熔断降级处理 2019-04-29
基于 Hystrix 高并发服务限流第 5 篇 —— Hystrix 监控 2019-04-29
Eureka 如何快速的、优雅的停止某个微服务 2019-04-29
Eureka 实现安全认证 2019-04-29
基于 Hystrix 高并发服务限流第 6 篇 —— 服务限流,基于 RateLimiter 实现 2019-04-29
Nginx 反向代理、负载均衡配置、Location正则表达式 2019-04-29