java中linkedblockingqueue的增加方法
在linkedblockingqueue的增加元素上,也我们之前所学的ArrayBlockingQueue有相通的地方。这里我们以其中的put方法进行举例,需要加入一些锁的使用对队列进行约束。下面就linkedblockingqueue增加元素的方法进行put的使用事项讲解,同时展示出对应的代码实例。
1.put方法使用事项
(1)使用putLock加锁;
(2)如果队列满了就阻塞在notFull条件上;
(3)否则就入队;
(4)如果入队后元素数量小于容量,唤醒其它阻塞在notFull条件上的线程;
(5)释放锁;
(6)如果放元素之前队列长度为0,就唤醒notEmpty条件;
2.put增加元素实例
public void put(E e) throws InterruptedException {if (e == null) throw new NullPointerException(); //e不能为null
int c = -1;
Node<E> node = new Node<E>(e);
final ReentrantLock putLock = this.putLock; //获取put锁
final AtomicInteger count = this.count; //获取count
putLock.lockInterruptibly();
try {
while (count.get() == capacity) { //如果满了,那么就需要使用notFull阻塞
notFull.await();
}
enqueue(node);
c = count.getAndIncrement();
if (c + 1 < capacity) //如果此时又有空间了,那么notFull唤醒
notFull.signal();
} finally {
putLock.unlock(); //释放锁
}
if (c == 0) //当c为0时候,也要根take锁说一下,并发下
signalNotEmpty(); //调用notEmpty
}
public E take() throws InterruptedException {
E x;
int c = -1;
final AtomicInteger count = this.count;
final ReentrantLock takeLock = this.takeLock;
// 使用takeLock加锁
takeLock.lockInterruptibly();
try {
// 如果队列无元素,则阻塞在notEmpty条件上
while (count.get() == 0) {
notEmpty.await();
}
// 否则,出队
x = dequeue();
// 获取出队前队列的长度
c = count.getAndDecrement();
// 如果取之前队列长度大于1,则唤醒notEmpty
if (c > 1)
notEmpty.signal();
} finally {
// 释放锁
takeLock.unlock();
}
// 如果取之前队列长度等于容量
// 则唤醒notFull
if (c == capacity)
signalNotFull();
return x;
}
private E dequeue() {
// head节点本身是不存储任何元素的
// 这里把head删除,并把head下一个节点作为新的值
// 并把其值置空,返回原来的值
Node<E> h = head;
Node<E> first = h.next;
h.next = h; // help GC
head = first;
E x = first.item;
first.item = null;
return x;
}
private void signalNotFull() {
final ReentrantLock putLock = this.putLock;
putLock.lock();
try {
// 唤醒notFull
notFull.signal();
} finally {
putLock.unlock();
}
}
以上就是java中linkedblockingqueue增加元素的方法,相信经过之前ArrayBlockingQueue的学习,以及结合本篇put使用事项的了解,大家已经能够学会对于其入队的相关操作了。
以上是 java中linkedblockingqueue的增加方法 的全部内容, 来源链接: utcz.com/z/542537.html