标签:oid 返回 cut nbsp 概述 服务端 tran ted img
BlockingQueue顾名思义‘阻塞的队列’,是指在它上面的操作都是被阻塞的(部分操作存在例外,如add等)。BlockQueue是java.util.concurrent工具包的重要基础工具,在ThreadPoolExcutor及tomcat等服务端容器中都有使用到。
BlockingQueue中的对象可以存放在:数组、链表中,对应的就是ArrayBlockingQueue、LinkedBlockingQueu;
以ArrayBlockingQueue的实现代码加以说明:
ArrayBlockingQueue.offer():
public boolean offer(E e) { checkNotNull(e); final ReentrantLock lock = this.lock; lock.lock(); try { if (count == items.length) return false; //如果队列已满,则返回false,不抛出异常 else { enqueue(e); //向队列尾部插入元素e return true; } } finally { lock.unlock(); } }
ArrayBlockingQueue.offer(timeout),带超时的offer:
public boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException { checkNotNull(e); long nanos = unit.toNanos(timeout); final ReentrantLock lock = this.lock; lock.lockInterruptibly(); //在lock锁定期间,该生产者线程可以被中断,好处是什么呢? try { while (count == items.length) { if (nanos <= 0) return false; nanos = notFull.awaitNanos(nanos); //和offer(e)不一样,该方法会等待队列的notFull信号量,但等待时长不会超过设定的timeout时长。 } enqueue(e); return true; } finally { lock.unlock(); } }
ArrayBlockingQueue.add():
public boolean add(E e) { if (offer(e)) return true; else throw new IllegalStateException("Queue full"); //队列满,抛出异常 }
ArrayBlockingQueue.put():
public void put(E e) throws InterruptedException { checkNotNull(e); final ReentrantLock lock = this.lock; lock.lockInterruptibly(); try { while (count == items.length) notFull.await(); //队列满时,生产者线程阻塞等待,直到该队列被消费者线程take后,notFull condition被signal触发 enqueue(e); } finally { lock.unlock(); } }
标签:oid 返回 cut nbsp 概述 服务端 tran ted img
原文地址:http://www.cnblogs.com/daoqidelv/p/6747333.html