首页 > 其他分享 >队列及阻塞队列基础

队列及阻塞队列基础

时间:2023-03-23 23:11:06浏览次数:40  
标签:String Thread format 队列 基础 阻塞 System take new

队列:先进先出的数据结构(FIFO)

java中的队列接口在java.util包下

常见的对列实现类有LinkedList

 

 

 

常见的阻塞队列:LinkedBlockingDeque,可以设置固定的容量,当队列有数据的时候会通知消费者消费,当对应满的时候会让生产者等待。

用LinkedBlockingDeque实现生产者消费者模式:两个厨师做烧饼,两个顾客买烧饼

  @Test
    public void test15() {
        final int count = 5;
        LinkedBlockingDeque<String> shaobingQueue = new LinkedBlockingDeque<>(3);

//        List<String> xiaoBaiMsg = new LinkedList<>();
        List<String> chushi1Msg = new LinkedList<>();
        List<String> chushi2Msg = new LinkedList<>();
        List<String> roadPeopleAmsg = new LinkedList<>();
        List<String> roadPeopleBmsg = new LinkedList<>();



        Thread roadPeopleA = new Thread(() -> {
            for (int i = 0; i < count; i++) {
                String take = null;
                try {
                    take = shaobingQueue.take();//队列没数据的时候会通知线程等待
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                roadPeopleAmsg.add(String.format("%d 路人甲买到了 [%s]", System.currentTimeMillis(), take));
            }
        });
        Thread roadPeopleB = new Thread(() -> {
            for (int i = 0; i < count; i++) {
                String take = null;
                try {
                    take = shaobingQueue.take();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                roadPeopleBmsg.add(String.format("%d 路人乙买到了 [%s]", System.currentTimeMillis(), take));
            }
        });

        Thread chushi1 = new Thread(() -> {
            for (int i = 0; i < count; i++) {
                String format = String.format("第%d个烧饼", i + 1);
                try {
                    shaobingQueue.put(format);//当队列满的时候会让线程等待
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                chushi1Msg.add(String.format("%d chushi1制作了 [%s],当前烧饼数量:%d", System.currentTimeMillis(), format, shaobingQueue.size()));
            }
        });
        Thread chushi2 = new Thread(() -> {
            for (int i = 0; i < count; i++) {
                String format = String.format("第%d个烧饼", i + 1);
                try {
                    shaobingQueue.put(format);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                chushi2Msg.add(String.format("%d chushi2制作了 [%s],当前烧饼数量:%d", System.currentTimeMillis(), format, shaobingQueue.size()));
            }
        });

        chushi1.start();
        chushi2.start();
        roadPeopleA.start();
        roadPeopleB.start();

        try {
            chushi1.join();
            chushi2.join();
            roadPeopleA.join();
            roadPeopleB.join();
        } catch (InterruptedException e) {
            SmallTool.printTimeAndThread("join 产生中断 "+ e.getMessage());
        }

        System.out.println(chushi1Msg.stream().collect(Collectors.joining("\n")));
        System.out.println(chushi2Msg.stream().collect(Collectors.joining("\n")));
        System.out.println("--------");
        System.out.println(roadPeopleAmsg.stream().collect(Collectors.joining("\n")));
        System.out.println(roadPeopleBmsg.stream().collect(Collectors.joining("\n")));
    }

 

标签:String,Thread,format,队列,基础,阻塞,System,take,new
From: https://www.cnblogs.com/wscw/p/17249881.html

相关文章

  • 关于AWS-CloudFront-基础设施-中国边缘站点说明
    AmazonCloudFront基础设施,AmazonCloudFront中国边缘站点网络,目前共4个PointsOfPresence(POP)目前4个边缘站点分别是:北京、上海、中卫和深圳在官网有详细的说明:htt......
  • 232. 用栈实现队列
    请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现MyQueue类:voidpush(intx)将元素x推到队列的末尾intpop()......
  • JS基础(上)
      JavaScript与HTML和CSS共同构成了我们所看到的网页,其中:HTML用来定义网页的内容,例如标题、正文、图像等;CSS用来控制网页的外观,例如颜色、字体、背景等;J......
  • 机器学习基础03DAY
    特征降维降维PCA(Principalcomponentanalysis),主成分分析。特点是保存数据集中对方差影响最大的那些特征,PCA极其容易受到数据中特征范围影响,所以在运用PCA前一定要做特征......
  • 图论基础模板
    P3388【模板】割点(割顶)#include<stdio.h>#definemin(x,y)((x)<(y)?(x):(y))intn,m;inthead[20003],last[200003],to[200003],ccnt=0;#defineadd......
  • 昇腾AI深耕沽上:港口辐射力之后,天津再添基础创新辐射力
    作者|曾响铃文| 响铃说AI计算正在以新基建联动产业集群的方式,加速落地。不久前,天津市人工智能计算中心正式揭牌,该中心整体规划300P算力,2022年底首批100P算力上线投入运......
  • Java面试-基础篇之5
    说一说synchronized关键字synchronized是java语言中的一个关键字,如同public、private、trycatch等可以在Java中直接被编译器识别的具有功能性的单词。synchronized中文意......
  • 优先队列
    什么是优先队列:优先队列就好比会员制的队列,有优先级这一特殊属性,根据优先级的高低来确定出队顺序优先队列也是一种抽象数据类型。优先队列中的每个元素都有优先级,而优先......
  • Python基础
    列表方法用法案例字符串方法字典方法用法案例集合方法1方法2用法案例文件对象方法......
  • MySQL基础:事务
    MySQL基础:事务事务简介事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时......