今天浏览博客,看了一道阿里的面试题,简单的看了一眼,完全不知道是啥玩意,于是学了一下,想想自己工作都快3年了,好多还不认识,有点难过,感觉自己都落伍了。
我来把这道题粘出来,你们看看有会的吗?
题目:请评估一下程序的执行结果?
public class SynchronousQueueQuiz {
public static void main(String[] args) throws Exception {
BlockingQueue<Integer> queue = new
SynchronousQueue<>();
System. out .print(queue.offer(1) + " ");
System. out .print(queue.offer(2) + " ");
System. out .print(queue.offer(3) + " ");
System. out .print(queue.take() + " ");
System. out .println(queue.size());
}
}
A. true true true 1 3
B. true true true (阻塞)
C. false false false null 0
D. false false false (阻塞)
出题人:阿里巴巴出题专家:桃谷/阿里云中间件技术专家
先不管这道题的答案是什么,首先需要了解一下BlockingQueue,才能知道答案把,哈哈!!
查了一下,简单的说:就是 阻塞式队列,如果此时该队列为空时,就会进入阻塞等待的状态,等到写入元素就会被唤醒,但是但该队列为满的状态时,就会一直被阻塞,直到有空间了,才会被唤醒!
这回这道题好像有一点思路了, BlockingQueue queue = new SynchronousQueue<>(); 此时该队列中是空队列,
- offer(E e): 添加元素,如果BlockingQueue可以容纳,则返回true,否则返回false,
这回就清楚了,当queue 为空时使用offer,是容纳不了的,就会返回false! 所以前三个都应该返回false.
- take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到Blocking有新的对象被加入为止
哦,queue 一直都是空的,所以就会阻塞!!!最后输入的长度也是会被阻塞执行不下去了,哦,这道题选D,哈哈!
我也不知道我的理解对不对,希望大神给予帮助,嘿嘿,多多学习!
想要了解更多关于 BlockingQueue 可以参考一下,很好的两篇文章:
1、https://blog.csdn.net/woshimike/article/details/53762148
2、https://wsmajunfeng.iteye.com/blog/1629354