Java 设计一个有界阻塞队列

有界阻塞队列,通常用于保证任务队列中没有任务时阻塞获取任务的线程,使得线程进入 wait 状态,释放 cpu 资源,在线程池中,有界阻塞队列也通常作为工作队列的实现。

我们可以自己实现一个有界阻塞队列,笔者这里使用了 Lock 锁的形势实现了一个简单的有界阻塞队列。

代码如下:

import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @Author: fengluo
 * @Date: 2022/10/2 22:24
 */
public class MyBlockingQueue {
    
    

    private int capacity = 10;
    private final Queue<Object> queue = new LinkedList<>();
    private final Lock lock = new ReentrantLock();
    private final Condition canPut = lock.newCondition();
    private final Condition canDel = lock.newCondition();
    public MyBlockingQueue() {
    
    }
    public MyBlockingQueue(int capacity) {
    
    
        this.capacity = capacity;
    }

    public void enqueue(Object task) {
    
    
        lock.lock();
        try {
    
    
            while (queue.size() >= capacity) {
    
    
                canPut.await();
            }
            queue.offer(task);
            canDel.signalAll();
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            lock.unlock();
        }
    }

    public Object dequeue() {
    
    
        Object res = new Object();
        lock.lock();
        try {
    
    
            while (queue.size() <= 0) {
    
    
                canDel.await();
            }
            res = queue.poll();
            canPut.signalAll();
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            lock.unlock();
        }
        return res;
    }

    public int size() {
    
    
        int res = 0;
        lock.lock();
        try {
    
    
            res = queue.size();
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            lock.unlock();
        }
        return res;
    }

}

猜你喜欢

转载自blog.csdn.net/qq_45523411/article/details/127147452