关于spring:java并发编程工具类JUC第二篇ArrayBlockingQueue

ArrayBlockingQueueBlockingQueue接口的实现类,它是有界的阻塞队列,外部应用数组存储队列元素。这里的“有界”是指存储容量存在下限,不能有限存储元素。在同一时间内存储容量存在着一个上限值,这个上限度在初始实例化的时候指定,之后便不能批改了。

ArrayBlockingQueue外部采纳FIFO (First In, First Out)先进先出的办法实现队列数据的存取,队首的元素是在队列中保留工夫最长的元素对象,队尾的元素是在队列中保留工夫最短的元素对象。

上面的代码阐明如何初始化一个ArrayBlockingQueue,并向其中增加一个对象:

BlockingQueue queue = new ArrayBlockingQueue(1024);
queue.put("1");   //向队列中增加元素
Object object = queue.take();   //从队列中取出元素

BlockingQueue能够通过泛型来限定队列中存储数据的类型,上面的代码以String为泛型,示意该队列只能存储String类型。

BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1024);
queue.put("1");
String string = queue.take();

实现一个生产生产的实例

在后面的文章中咱们已经讲过:BlockingQueue常常被用于生产生产的缓冲队列。上面咱们就应用ArrayBlockingQueue来真正的实现一个生产生产的例子。

BlockingQueueExample开启两个独立线程,一个是Producer生产者线程,负责向队列中增加数据;另一个是Consumer消费者线程,负责从队列中取出数据进行解决。

public class BlockingQueueExample {

    public static void main(String[] args) throws Exception {
        //应用ArrayBlockingQueue初始化一个BlockingQueue,指定容量的下限为1024
        BlockingQueue queue = new ArrayBlockingQueue(1024);
        
        Producer producer = new Producer(queue);  //生产者
        Consumer consumer = new Consumer(queue);  //消费者

        new Thread(producer).start();  //开启生产者线程
        new Thread(consumer).start();  //开启消费者线程

        Thread.sleep(4000);
    }
}

Producer为生产者,每隔10秒钟应用put()办法向队列中放入一个对象,放入三次。在这10秒的距离内,队列数据被消费者取走之后将导致消费者线程阻塞。

public class Producer implements Runnable{

    protected BlockingQueue queue = null;

    public Producer(BlockingQueue queue) {
        this.queue = queue;
    }

    public void run() {
        try {
            queue.put("1");
            Thread.sleep(10000);
            queue.put("2");
            Thread.sleep(10000);
            queue.put("3");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

上面的代码是消费者类Consumer,它从队列中获取待处理的元素对象,并调用System.out将其打印进去。

public class Consumer implements Runnable{

    protected BlockingQueue queue = null;

    public Consumer(BlockingQueue queue) {
        this.queue = queue;
    }

    public void run() {
        try {
            System.out.println(queue.take());
            System.out.println(queue.take());
            System.out.println(queue.take());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

下面的代码打印后果是每隔10秒打印一次,因为其中take()办法在队列内没有元素能够取到的时候,会阻塞以后的消费者线程,让其处于期待状态,这个办法咱们在上一节介绍BlockingQueue的时候就曾经进行过阐明。

欢送关注我的博客,外面有很多精品合集

本文转载注明出处(必须带连贯,不能只转文字):字母哥博客 – zimug.com

感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源! 。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。

  • 《手摸手教你学Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2一本通》
  • 《实战前后端拆散RBAC权限管理系统》
  • 《实战SpringCloud微服务从青铜到王者》
  • 《VUE深入浅出系列》

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理