add办法和offer办法不会壅塞线程,put办法如不雅队列满了会壅塞线程,直到有线程花费了队列里的数据才有可能被唤醒。
这3个办法内部都邑应用可重入锁包管原子性。
数据的删除
ArrayBlockingQueue有不合的几个数据删除办法,poll、take、remove办法。
poll办法:
- public E poll() {
- final ReentrantLock lock = this.lock;
- lock.lock(); // 加锁,包管调用poll办法的时刻只有1个线程
- try {
- return (count == 0) ? null : extract(); // 如不雅队列琅绫腔元素了,返回null,不然调用extract办法
- } finally {
- lock.unlock(); // 释放锁,让其他线程可声调用poll办法
- }
- }
poll办法内部调用extract办法:
- private E extract() {
- final Object[] items = this.items;
- E x = this.<E>cast(items[takeIndex]); // 获得取索引地位上的元素
- items[takeIndex] = null; // 对应取索引上的数据清空
- takeIndex = inc(takeIndex); // 取数据索引+1,当索引满了变成0
- --count; // 元素个数-1
- notFull.signal(); // 应用前提对象notFull通知,比如应用put办法放数据的时刻队列已满,被壅塞。这个时刻花费了一条数据,队列没满了,就须要调用signal进行通知
- return x; // 返回元素
- }
常用的壅塞队列具体类有ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue、LinkedBlockingDeque等。
take办法:
- public E take() throws InterruptedException {
- final ReentrantLock lock = this.lock;
- lock.lockInterruptibly(); // 加锁,包管调用take办法的时刻只有1个线程
- try {
- while (count == 0) // 如不雅队列空,壅塞当前哨程,并参加到前提对象notEmpty的等待队列里
- notEmpty.await(); // 线程壅塞并被挂起,同时释放锁
- return extract(); // 调用extract办法
- } finally {
- lock.unlock(); // 释放锁,让其他线程可声调用take办法
推荐阅读
核心提示: 大年夜量来自于发念头和其他一些关键部件的监控数据,使得猜测性维修具备了可行性。越来越多的数据的收集和分析对象正在被开辟或者投入应用。大年夜量来自于发念头和其他一些关>>>详细阅读
本文标题:Java阻塞队列实现原理分析
地址:http://www.17bianji.com/lsqh/34749.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示