ConcurrentLinkedQueue并发抢票示例

在学习java并发的时候,在网上看了几个靠加锁方法块的方法来演示抢票的示例,运行起来还是要起并发冲突。后来看到一个用ConcurrentLinkedQueue(并发链接队列)来演示抢票的demo不错。然后我想在main最后末尾的时候打印各个并发线程实际抢票的总数,却始终看不到该显示出来的打印行。原来是main线程也参与了并发,打印行随机在中间位置。为了解决这个问题,可以使用CountDownLatch(倒计锁),等并发抢票线程都结束后,再接着运行main线程中后面的打印语句。
ConcurrentLinkedQueue的语义描述,可参考一下:

  • A {@code ConcurrentLinkedQueue} is an appropriate choice when
  • many threads will share access to a common collection.
  • Like most other concurrent collection implementations, this class
  • does not permit the use of {@code null} elements.

java示例demo

public class SellTicketQueue {static Queue<String> tickets = new ConcurrentLinkedQueue<>();//1.初始化并发队列容器static {for (int i = 1; i <= 1000; i++) tickets.add("第" + i + "张票");//2.往容器中放1000张票}static  HashMap<String, Integer> map = new HashMap<>();final static CountDownLatch countDownLatch = new CountDownLatch(3);public static void main(String[] args) {for (int i = 0; i < 4; i++) {  //3.开启多个线程抢票new Thread(() -> {while (true) {String ticket = tickets.poll();  //4.一张张票出队列if (ticket == null) break;else System.out.println(Thread.currentThread().getName() + "销售--" + ticket);Integer num = map.computeIfAbsent(Thread.currentThread().getName(), k -> 0);num++;map.put(Thread.currentThread().getName(), num);}countDownLatch.countDown();}).start();}//5.以下代码实现在抢票线程完毕后,再打印各小计票数(保证打印在最末尾)try {countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}for (Map.Entry<String, Integer> m : map.entrySet()) {System.out.println(m.getKey() + " 总数 : " + m.getValue());}System.out.println("main thread is over ");}
}

运行结果:这样看起来汇总小计直观一些。

Java并发队列ConcurrentLinkedQueue抢票示例相关推荐

  1. 10分钟搞定 Java 并发队列

    前言 如果按照用途与特性进行粗略的划分,JUC 包中包含的工具大体可以分为 6 类: 执行者与线程池 并发队列 同步工具 并发集合 锁 原子变量 在[并发系列]中,主要讲解了 执行者与线程池,同步工具 ...

  2. 10分钟搞定 Java 并发队列好吗?好的

    前言 如果按照用途与特性进行粗略的划分,JUC 包中包含的工具大体可以分为 6 类: 执行者与线程池 并发队列 同步工具 并发集合 锁 原子变量 在[并发系列]中,主要讲解了 执行者与线程池,同步工具 ...

  3. java并发队列_Java并发教程–阻塞队列

    java并发队列 如第3部分所述,Java 1.5中引入的线程池提供了核心支持,该支持很快成为许多Java开发人员的最爱. 在内部,这些实现巧妙地利用了Java 1.5中引入的另一种并发功能-阻塞队列 ...

  4. java 并发队列_JAVA并发编程:阻塞队列BlockingQueue之SynchronousQueue

    前面在讲解Executors工厂创建可缓存线程的线程池(newCachedThreadPool)的时候有提到过SynchronousQueue队列,该线程池使用 SynchronousQueue 作为 ...

  5. 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法

    转载自https://blog.csdn.net/westos_linux/article/details/78968012 在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就 ...

  6. 基于Java实现的火车票抢票并发数据结构处理

    资源下载地址:https://download.csdn.net/download/sheziqiong/87473207 资源下载地址:https://download.csdn.net/downl ...

  7. 并发编程(九)—— Java 并发队列 BlockingQueue 实现之 LinkedBlockingQueue 源码分析...

    LinkedBlockingQueue 在看源码之前,通过查询API发现对LinkedBlockingQueue特点的简单介绍: 1.LinkedBlockingQueue是一个由链表实现的有界队列阻 ...

  8. 解读 Java 并发队列 BlockingQueue

    最近得空,想写篇文章好好说说 java 线程池问题,我相信很多人都一知半解的,包括我自己在仔仔细细看源码之前,也有许多的不解,甚至有些地方我一直都没有理解到位. 说到线程池实现,那么就不得不涉及到各种 ...

  9. java并发编程代码示例_java并发编程之同步器代码示例

    java并发编程之同步器代码示例 发布时间:2020-09-08 16:53:41 来源:脚本之家 阅读:58 作者:Blessing_H 同步器是一些使线程能够等待另一个线程的对象,允许它们协调动作 ...

最新文章

  1. Android----PopupWindow
  2. python property装饰器原理,Python @property装饰器不起作用
  3. js---html元素操作
  4. boost::ratio_not_equal相关的测试程序
  5. Android sqlite load_extension漏洞解析
  6. [html] HTML全局属性(global attribute)有哪些(包含H5)?
  7. 安卓学习笔记44:开源框架okhttp3入门
  8. parallels desktop 启动过失败_使用u启动软件制作启动盘时注意哪些【详细介绍】...
  9. Docker系列教程06-实战:修改Nginx首页
  10. jpeg 转rgb c 语言_威刚推出SE770G移动固态硬盘 主打高速传输和RGB灯效
  11. java adt真机调试_Unity Android 真机调试
  12. 【牛客练习赛58-C】矩阵消除游戏(dfs+状态标记)
  13. BT5 WIFI破解
  14. android studio 或者 idea 前进 后退 箭头图标添加到 工具栏
  15. 大数据来临,商业银行面对合规挑战!
  16. 单片机跑操作系统,到底有几种选择?
  17. Typora + PicGo + 七牛云图床
  18. 原生JS实现公告栏文字横向滚动(通告栏)
  19. 用HTML5+CSS实现3d动画立方体
  20. netdata-监控mysql及tomcat插件

热门文章

  1. matlab在机电一体化的仿真图,基于MATLABSimulink的机电一体化系统的仿真分析实验.doc...
  2. r语言 面板数据回归_工具方法 | “名牌包”:面板、时间序列模型常用R语言包...
  3. jq分页 不刷新页面_jquery实现无刷新分页,跳转
  4. Java操作poi导出Excel自定义字体颜色
  5. 我在ADAU1452这颗音频DSP上,用MFXLMS算法来做Active Noise Cancellation(ANC)
  6. mysql 类图_类图 - 吴小凯 - 博客园
  7. GPS接收机设计(4)——帧同步
  8. 【网络通信 -- 直播】项目实战记录 -- 弱网模拟工具
  9. 局域网、广域网、城域网的介绍,
  10. 小女孩和父亲的爆笑对话