多线程之 阻塞队列

        大神Doug lea 给我们开发者创建了一个名为BlockQueue的接口,见名知义就是阻塞队列,它是线程安全的,经常在JUC包下源码下可以看到它的身影,究竟为何物我们一起来学习下吧。

        从上图我们可以很清楚看到,通过一个共享的队列,可以使得数据由队列的一端输入,从另外一端输出;常用的队列主要有以下两种(当然通过不同的实现方式,还可以延伸出很多不同类型的队列,DelayQueue就是其中的一种)

  1. 先进先出(FIFO):先插入的队列的元素也最先出队列,类似于排队的功能。从某种程度上来说这种队列也体现了一种公平性
  2. 后进先出(LIFO):后插入队列的元素最先出队列,这种队列优先处理最近发生的事件

        在多线程的情况下,比如经典的生产者与消费者模型,生产者把消息发到共享的队列上去,消费者然后从队列中取数,队列就可以很容易的实现数据共享,但是当生产者生产消息的速度 > 消费者的速度时,由于消息队列长度有限,生产者必须要停滞生产消息。反之消费者消费的速度  > 生产者的生产速度,消费者也必须停滞消费。而这一切都需要我们开发者自己用逻辑实现而且还要考虑到线程安全问题。但从jdk1.5后,大神帮我们实现了上述功能,

  • 当队列消息溢出时,生产者线程陷入阻塞,当队列有空位置时,线程自动被唤醒。
  • 当队列消息为空时,消费者线程从中拿取消息,该线程会陷入阻塞,当队列有数据时,线程会被自动唤醒。

这也就是我们JUC包里经常要学习到的线程通信,比如Condition(await/single)、LockSupport(park/unpark)等,这些也都是后话了。

发布了73 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_40826106/article/details/104061401