广州北大青鸟计算机职业培训学校
互联网技术培训、软件技术培训、大数据培训、云计算培训、数据分析培训信息网
当前位置:网站首页 > 软件教程 > Java技术 > 正文

惠州Java特殊队列中的阻塞队列是什么?_北大青鸟IT学校

作者:邓华发布时间:2021-04-18分类:Java技术浏览:679


导读:Java是现在非常主流的编程语言之一,很多人想转行学习Java。那么,Java特殊队列中的阻塞队列是什么?下面就让我们一起来看看惠州北大青鸟老师是怎么回答的。

Java是现在非常主流的编程语言之一,很多人想转行学习Java。那么,Java特殊队列中的阻塞队列是什么?下面就让我们一起来看看惠州北大青鸟老师是怎么回答的。

阻塞队列通过添加两组方法来扩展队列:

  1. 一组方法无限期地阻塞

  2. 另一组方法允许您指定要阻止的时间段。

BlockingQueue 接口的实例表示阻塞队列。 BlockingQueue 接口继承自 Queue 接口。

put()和 offer()方法在阻塞队列的尾部添加一个元素。如果阻塞队列已满,则put()方法将无限期阻塞,直到队列中的空间可用。offer()方法允许您指定等待空间可用的时间段。 如果指定的元素添加成功,则返回true; 否则为假。

take()和poll()方法检索和删除阻塞队列的头。如果阻塞队列为空,take()方法将无限期阻塞。poll()方法允许您指定在阻塞队列为空时要等待的时间段; 如果在元素可用之前过去了指定的时间,则返回null。

来自 BlockingQueue 中 Queue 接口的方法就像使用 Queue 。

BlockingQueue 被设计为线程安全的并且可以使用在生产者/消费者的情况下。

阻塞队列不允许空元素和可以是有界的或无界的。

BlockingQueue 中的 remainingCapacity()返回可以添加到阻止队列中而不阻塞的元素数。

BlockingQueue 可以控制多个线程被阻塞时的公平性。 如果阻塞队列是公平的,它可以选择最长的等待线程来执行操作。如果阻塞队列不公平,则不指定选择的顺序。

BlockingQueue 接口及其所有实现类都在 java.util.concurrent 包中。 以下是 BlockingQueue接口的实现类:

由数组支持的 ArrayBlockingQueue 是 BlockingQueue 的有界实现类。 我们可以在其构造函数中指定阻塞队列的公平性。 默认情况下,它不公平。

LinkedBlockingQueue 可以用作有界或无界阻塞队列。 它不允许为阻塞队列指定公平规则。

PriorityBlockingQueue 是 BlockingQueue 的无界实现类。 它的工作方式与 PriortyQueue 相同,用于排序阻塞队列中的元素,并将阻塞特性添加到 PriorityQueue 中。

SynchronousQueue 实现 BlockingQueue ,没有任何容量。 put操作等待take操作以获取元素。 它可以在两个线程之间进行握手,并在两个线程之间交换对象。 它的isEmpty()方法总是返回true。

DelayQueue是BlockingQueue的无界实现类。它保持一个元素,直到该元素经过指定的延迟。 如果有超过一个元素的延迟已经过去,那么其延迟最早传递的元素将被放置在队列的头部。

实例

以下代码显示了如何在生产者/消费者应用程序中使用阻塞队列。

import java.util.UUID;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;class BQProducer extends Thread {  private final BlockingQueue<String> queue;  private final String name;  public BQProducer(BlockingQueue<String> queue, String name) {
   this.queue = queue;
   this.name = name;
 }
 @Override  public void run() {    while (true) {      try {
       this.queue.put(UUID.randomUUID().toString());
       Thread.sleep(4000);
     }      catch (InterruptedException e) {
       e.printStackTrace();        break;
     }
   }
 }
}class BQConsumer extends Thread {  private final BlockingQueue<String> queue;  private final String name;  public BQConsumer(BlockingQueue<String> queue, String name) {
   this.queue = queue;
   this.name = name;
 }

 @Override  public void run() {    while (true) {      try {
       String str = this.queue.take();
       System.out.println(name + "  took: " + str);
       Thread.sleep(3000);
     } catch (InterruptedException e) {
       e.printStackTrace();        break;
     }
   }
 }
}public class Main {  public static void main(String[] args) {    int capacity = 5;    boolean fair = true;
   BlockingQueue<String> queue = new ArrayBlockingQueue<>(capacity, fair);    new BQProducer(queue, "Producer1").start();    new BQProducer(queue, "Producer2").start();    new BQProducer(queue, "Producer3").start();    new BQConsumer(queue, "Consumer1").start();    new BQConsumer(queue, "Consumer2").start();
 }
}

上面的代码生成以下结果。

Java特殊队列之阻塞队列.png

更多Java资讯关注网站动态,或者来惠州北大青鸟新方舟校区了解一下。

标签:惠州计算机JAVA软件开发惠州计算机Java软件开发惠州计算机JAVA培训惠州计算机JAVA软件开发学校惠州计算机Java软件开发培训JAVAJava软件开发北大青鸟IT计算机学校北大青鸟IT软件学校北大青鸟IT学校


Java技术排行
标签列表
网站分类
文章归档
最近发表