1. package com.lilei.pack09;
  2.  
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5.  
  6. public class MySyncQueue<T> {
  7.  
  8. private Object[] ts;
  9.  
  10. int pos = -1;
  11.  
  12. public MySyncQueue(int size) {
  13. ts = new Object[size];
  14. }
  15.  
  16. public synchronized void push(T t) throws InterruptedException {
  17. while (true) {
  18. if (pos + 1 < ts.length) {
  19. ts[++pos] = t;
  20. notifyAll();
  21. System.out.println(Thread.currentThread().getName() + " push,currentSize=" + (pos + 1));
  22. return;
  23. } else {
  24. wait();
  25. }
  26. }
  27. }
  28.  
  29. public synchronized T pop() throws InterruptedException {
  30.  
  31. while (true) {
  32. if (pos >= 0) {
  33. @SuppressWarnings("unchecked")
  34. T t = (T) ts[pos--];
  35.  
  36. notifyAll();
  37.  
  38. System.out.println(Thread.currentThread().getName() + " pop,currentSize=" + (pos + 1));
  39.  
  40. return t;
  41. } else {
  42. wait();
  43. }
  44. }
  45.  
  46. }
  47.  
  48. public static class Inner {
  49.  
  50. }
  51.  
  52. public static void main(String[] args) {
  53. ExecutorService es = Executors.newFixedThreadPool(30);
  54.  
  55. final MySyncQueue<Inner> queue = new MySyncQueue<Inner>(15);
  56.  
  57. int repeat = 1000;
  58.  
  59. while (repeat-->0) {
  60.  
  61. for (int i = 0; i < 15; i++) {
  62. es.execute(new Runnable() {
  63. public void run() {
  64.  
  65. try {
  66. queue.pop();
  67. } catch (InterruptedException e) {
  68. e.printStackTrace();
  69. }
  70. }
  71. });
  72. }
  73.  
  74. for (int i = 0; i < 15; i++) {
  75. es.execute(new Runnable() {
  76. public void run() {
  77.  
  78. try {
  79. queue.push(new Inner());
  80. } catch (InterruptedException e) {
  81. e.printStackTrace();
  82. }
  83. }
  84. });
  85. }
  86.  
  87. }
  88.  
  89. es.shutdown();
  90. }
  91.  
  92. }

基于synchronized实现的阻塞队列的更多相关文章

  1. 用阻塞队列实现一个生产者消费者模型?synchronized和lock有什么区别?

    多线程当中的阻塞队列 主要实现类有 ArrayBlockingQueue是一个基于数组结构的有界阻塞队列,此队列按FIFO原则对元素进行排序 LinkedBlockingQueue是一个基于链表结构的 ...

  2. java并发:阻塞队列

    第一节 阻塞队列 1.1 初识阻塞队列 队列以一种先进先出的方式管理数据,阻塞队列(BlockingQueue)是一个支持两个附加操作的队列,这两个附加的操作是:在队列为空时,获取元素的线程会等待队列 ...

  3. java高并发系列 - 第25天:掌握JUC中的阻塞队列

    这是java高并发系列第25篇文章. 环境:jdk1.8. 本文内容 掌握Queue.BlockingQueue接口中常用的方法 介绍6中阻塞队列,及相关场景示例 重点掌握4种常用的阻塞队列 Queu ...

  4. Java并发编程之阻塞队列

    1.什么是阻塞队列? 队列是一种数据结构,它有两个基本操作:在队列尾部加入一个元素,从队列头部移除一个元素.阻塞队里与普通的队列的区别在于,普通队列不会对当前线程产生阻塞,在面对类似消费者-生产者模型 ...

  5. 细说并发5:Java 阻塞队列源码分析(下)

    上一篇 细说并发4:Java 阻塞队列源码分析(上) 我们了解了 ArrayBlockingQueue, LinkedBlockingQueue 和 PriorityBlockingQueue,这篇文 ...

  6. Java集合--阻塞队列及各种实现的解析

    阻塞队列(Blocking Queue) 一.队列的定义 说的阻塞队列,就先了解下什么是队列,队列也是一种特殊的线性表结构,在线性表的基础上加了一条限制:那就是一端入队列,一端出队列,且需要遵循FIF ...

  7. Java多线程_JUC包下的阻塞队列

    在前面我们提到了阻塞队列,也用过了LinkedBolckingQueue队列了,在这里,我们主要对 ArrayBlockingQueue,PriorityBlockingQueue,DelayQueu ...

  8. Java多线程_阻塞队列

    1.什么是阻塞队列       我们知道,PriorityQueue.LinkedList这些都是非阻塞队列.在我们使用非阻塞队列的时候有一个很大问题,它不会对当前线程产生阻塞,那么在面对类似消费者- ...

  9. Java并发包源码学习系列:阻塞队列实现之ArrayBlockingQueue源码解析

    目录 ArrayBlockingQueue概述 类图结构及重要字段 构造器 出队和入队操作 入队enqueue 出队dequeue 阻塞式操作 E take() 阻塞式获取 void put(E e) ...

随机推荐

  1. 快速入门vue-cli配置

    作为一名使用了一段时间Vue.js的新手,相信和不少初入Vue的朋友一样,都对Vue-cli的配置一知半解.后来通过对webpack的学习,也算是对脚手架的配置有了一定的了解,所以也想把这段时间自己的 ...

  2. 《android开发艺术探索》读书笔记(十五)--Android性能优化

    接上篇<android开发艺术探索>读书笔记(十四)--JNI和NDK编程 No1: 如果<include>制定了这个id属性,同时被包含的布局文件的根元素也制定了id属性,那 ...

  3. css y轴溢出滚动条,x轴溢出显示

    这个是我工作中遇到的一个问题,困扰了我好几天,彻底理解了什么叫思路很重要. 黄色盒子里的内容是要超出出现滚动条的,红色的方块是根据另外的元素去定位的,于是呢 我就加上了 overflow-y:auto ...

  4. mac 系统安装 eclipse 方法

    经过好几天的折腾,终于在各种不靠谱的经验.说明的忽悠中把自己心爱的 mac 安装上了 eclipse,看到别人的不靠谱,我决定自己写一篇经验,为了大家能够不走我这么多的弯路,也为了自己将来可以回来看看 ...

  5. loading加载动画

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写

      很长一段时间没有更新博客了,是因为要推出新开发方案和做好客户服务工作,忙得不易乐乎.有关DAVINCI U-BOOT的移植,以前写过一篇u-boot-1.3.4(2008年的),其实和这个u-bo ...

  7. R语言学习笔记︱Echarts与R的可视化包——地区地图

    笔者寄语:感谢CDA DSC训练营周末上完课,常老师.曾柯老师加了小课,讲了echart与R结合的函数包recharts的一些基本用法.通过对比谢益辉老师GitHub的说明文档,曾柯老师极大地简化了一 ...

  8. Java Web项目(Extjs)报错二

    1.Java Web项目(Extjs)报错二 具体报错如下: usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ...

  9. JSP常见的三个编译指令

    JSP常见的三个编译指令 1.page指令   是针对当前页面的指令 2.include指令    用于指定包含另一个页面 3.taglib指令    用于定义和访问自定义标签

  10. pat1011-1020

    一开始几道题写到吐血,真的自己现在好弱 1011 水题不说了 #include<bits/stdc++.h> using namespace std; const int N = 105; ...