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();
}
}
}
标签:JUC,队列,lock,编程,阻塞,datalist,线程,Condition
From: https://blog.csdn.net/m0_59925573/article/details/140750827