java基于reentrantlock/condition/queue实现阻塞队列

java 复制代码
java
package com.example.demo.blocked_queue;

import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 有界阻塞队列,基于 ReentrantLock + Condition,使用 JDK Queue 作为缓冲实现
 */
public class MyBlockedQueue<E> {
    private final Queue<E> queue;
    private final int capacity;

    private final ReentrantLock lock = new ReentrantLock();
    private final Condition notEmpty = lock.newCondition();
    private final Condition notFull = lock.newCondition();

    public MyBlockedQueue(int capacity) {
        if (capacity <= 0) throw new IllegalArgumentException("capacity must be > 0");
        this.capacity = capacity;
        this.queue = new LinkedList<>();
    }

    // 将元素放入队列,队列满则等待(可中断)
    public void put(E e) throws InterruptedException {
        if (e == null) throw new NullPointerException();
        lock.lockInterruptibly();
        try {
            while (queue.size() == capacity) {
                notFull.await();
            }
            queue.add(e);
            // 唤醒等待取元素的线程
            notEmpty.signal();
        } finally {
            lock.unlock();
        }
    }

    // 从队列取出元素,队列空则等待(可中断)
    public E take() throws InterruptedException {
        lock.lockInterruptibly();
        try {
            while (queue.isEmpty()) {
                notEmpty.await();
            }
            E e = queue.remove();
            // 唤醒等待放元素的线程
            notFull.signal();
            return e;
        } finally {
            lock.unlock();
        }
    }

    public int size() {
        lock.lock();
        try {
            return queue.size();
        } finally {
            lock.unlock();
        }
    }

    public boolean isEmpty() {
        return size() == 0;
    }

    public boolean isFull() {
        lock.lock();
        try {
            return queue.size() == capacity;
        } finally {
            lock.unlock();
        }
    }

    @Override
    public String toString() {
        lock.lock();
        try {
            return "MyBlockedQueue{" +
                    "queue=" + queue +
                    ", capacity=" + capacity +
                    '}';
        } finally {
            lock.unlock();
        }
    }
}
相关推荐
weixin_3077791316 分钟前
C++代码实现MATLAB中的spectralcluster函数功能
开发语言·c++·算法·matlab
鸽鸽程序猿16 分钟前
【项目】【在线判题系统】c端:竞赛报名
c语言·开发语言
wangjialelele17 分钟前
一文梳理 Spring Cloud 核心组件:Eureka、Nacos、OpenFeign、LoadBalancer 与 Gateway
java·spring boot·spring·spring cloud·微服务·nacos
用户62228840481919 分钟前
站在JDK的角度理解线程池:从execute 到 getTask 一篇讲透
java·面试
Wang's Blog20 分钟前
Java 项目实战: 交友项目 - 个人资料管理的需求分析与接口设计
java·开发语言·交友
北风toto23 分钟前
Linux 服务器如何判断 CPU 是否支持 x86-64-v2 指令集
java·linux·服务器
1024奇点24 分钟前
【仓颉语言入门 · 第二篇 第 8 课】
开发语言·数据库·ide·mysql·开源
萧瑟余晖26 分钟前
Spring Security综合实战与安全加固详解
java·安全·spring
gopher951139 分钟前
RUST:序列化与反序列化 serde + derive 详解
开发语言·后端·rust
imDwAaY41 分钟前
操作系统如何管理程序运行?从线程、进程到内存隔离与用户态切换:CS162 Note2
android·java·redis