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();
        }
    }
}
相关推荐
忧郁的Mr.Li17 小时前
SpringBoot中实现多数据源配置
java·spring boot·后端
玄同76517 小时前
从 0 到 1:用 Python 开发 MCP 工具,让 AI 智能体拥有 “超能力”
开发语言·人工智能·python·agent·ai编程·mcp·trae
czy878747517 小时前
深入了解 C++ 中的 `std::bind` 函数
开发语言·c++
消失的旧时光-194317 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed
yq19820430115617 小时前
静思书屋:基于Java Web技术栈构建高性能图书信息平台实践
java·开发语言·前端
一个public的class17 小时前
你在浏览器输入一个网址,到底发生了什么?
java·开发语言·javascript
有位神秘人17 小时前
kotlin与Java中的单例模式总结
java·单例模式·kotlin
Jinkxs17 小时前
Gradle - 与Groovy/Kotlin DSL对比 构建脚本语言选择指南
android·开发语言·kotlin
&有梦想的咸鱼&17 小时前
Kotlin委托机制的底层实现深度解析(74)
android·开发语言·kotlin
golang学习记17 小时前
IntelliJ IDEA 2025.3 重磅发布:K2 模式全面接管 Kotlin —— 告别 K1,性能飙升 40%!
java·kotlin·intellij-idea