前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >曾经被面试过BlockingQueue吗?

曾经被面试过BlockingQueue吗?

作者头像
PhoenixZheng
发布2018-08-07 16:48:52
2290
发布2018-08-07 16:48:52
举报
文章被收录于专栏:Phoenix的Android之旅

面试时曾经被问过阻塞队列吗?

想必很多人面试时有被问到阻塞队列的经历。我们经常会在各种代码中见到或者用到它,最经常见到的地方就是线程池。

但是如果问起阻塞队列的原理,它是基于什么实现的,你是否说的上来呢?

陌生又熟悉的BlockingQueue

阻塞队列(BlockingQueue)其实也是队列,但是它有两个特点, · 当队列满时,往队列的put()操作会导致当前线程阻塞 · 当队列空时,向队列的take()操作也会导致当前线程阻塞

BlockingQueue经常用在以下几个场景 · 生产者&消费者 · 线程间通信 · 线程池

问题1:add()和put()有什么不同?

相信很多人都知道,add()其实并不是阻塞操作,当队列满时add()会抛出异常,而put()不会抛出异常。

问题2:阻塞队列的原理是什么?

看过上一篇文章的朋友肯定立马想到BlockingQueue是基于Condition,我们可以用很简单的代码写出阻塞队列的原理

代码语言:javascript
复制
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();

final Object[] items = new Object[100];
int putptr, takeptr, count;

public void put(Object x) throws InterruptedException {
    lock.lock();
    try {
        while (count == items.length) {
            notFull.await();
        }

        items[putptr] = x;
        if (++putptr == items.length)
            putptr = 0;
        ++count;
        notEmpty.signal();
    } finally {
        lock.unlock();
    }
}

public Object take() throws InterruptedException {
    lock.lock();
    try {
        while (count == 0) {
            notEmpty.await();
        }
        Object x = items[takeptr];
        if (++takeptr == items.length)
            takeptr = 0;
        --count;
        notFull.signal();
        return x;
    } finally {
        lock.unlock();
    }
}

以put()为例说明,当队列满时,当前线程会等待notFull条件满足,若不满足则持续等待。直到有take()操作,队列的notFull条件满足,才会往队列放对象,同时让notEmpty条件满足,对应的take()操作才能正常进行。

总结

看完这篇文章,相信你已经明白阻塞队列的实现原理了吧。以下是它的主要子类 · ArrayBlockingQueue · LinkedBlockingQueue · SynchronousQueue 虽然它们的具体实现各不相同,但是原理都是一样基于Condition去实现的。

下次面试时被问到BlockingQueue的话就可以淡定的说啦! 欢迎订阅关注!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android每日一讲 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 陌生又熟悉的BlockingQueue
    • 问题1:add()和put()有什么不同?
      • 问题2:阻塞队列的原理是什么?
      • 总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档