JUC并发编程:基于Condition实现一个阻塞队列

Condition方法概述

await(): 当前线程进入等待状态,直到被通知(siginal)或中断【和wait方法语义相同】。

awaitUninterruptibly(): 当前线程进入等待状态,直到被通知,对中断不敏感。

awaitNanos(long timeout): 当前线程进入等待状态直到被通知(siginal),中断或超时。

awaitUnitil(Date deadTime): 当前线程进入等待状态直到被通知(siginal),中断或到达某个时间。

signal(): 唤醒一个等待在Condition上的线程,该线程从等待方法返回前必须获得与Condition关联的锁【和notify方法语义相同】

signalAll(): 唤醒所有等待在Condition上的线程,能够从等待方法返回的线程必须获得与Condition关联的锁【和notifyAll方法语义相同】。

实现阻塞队列

基于自定义互斥锁,实现阻塞队列。阻塞队列具有两个特点:
添加元素到队列中, 如果队列已满会使得当前线程阻塞【加入到条件队列-队列不满】,直到队列不满为止
移除队列中的元素,当队列为空时会使当前线程阻塞【加入到条件队列-队列不空】,直到队列不为空为止
上一篇中的互斥锁:
https://blog.csdn.net/m0_59925573/article/details/140748134?spm=1001.2014.3001.5501

//基于上一篇实现的互斥锁实现阻塞队列
//阻塞队列的特点 如果队列已满当前线程会阻塞知道唤醒
//移除队列中的元素,当队列为空的使当前线程阻塞
@Slf4j
public class BoundedBlockingQueue<T> {
    private List<T> datalist;
    private int size;
    private MyLock lock;

    private Condition notEmpty;
    private Condition notFull;

    public BoundedBlockingQueue(int size){
        this.datalist = new ArrayList<>();
        this.size = size;
        lock = new MyLock();
        notEmpty = lock.newCondition();
        notFull = lock.newCondition();
    }
    //向队列中添加元素
    public void add(T data) {
        lock.lock();
        try {
            //如果队列已经满了 保持等待
            while (datalist.size() == size){
                notFull.await();
            }
            datalist.add(data);
            System.out.println("add success" + data);
            notEmpty.signal();
        }catch (InterruptedException e){
            log.error("add{}",e.getMessage());
        }finally {
            lock.unlock();
        }
    }
    //移除队列中的第一个元素
    public void remove() {
        lock.lock();
        try {
            while (datalist.isEmpty()){
                notFull.await();
            }
            T t = datalist.get(0);
            datalist.remove(0);
            System.out.println("remove success" + t);
            notFull.signal();
        }catch (InterruptedException e){
            log.error("remove{}",e.getMessage());
        }finally {
            lock.unlock();
        }
    }
}
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值