1.创建Queue.java

public class Queue {

private LinkedList list = new LinkedList() ;

private final int minSize = 0 ; ;

private final int maxSize ;

private AtomicInteger count = new AtomicInteger(0) ;

public Queue(int size){

this.maxSize = size ;

}

private final Object lock = new Object() ;

public void put(Object o){

synchronized(lock){

while(size() == this.maxSize){

try {

lock.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

list.add(o) ;

//计数器增加

count.incrementAndGet() ;

//通知唤醒

lock.notify();

}

}

private int size(){

return count.get() ;

}

public Object take(){

Object res = null ;

synchronized(lock){

while(size() == this.minSize){

try {

lock.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

res = list.removeFirst();

//计数器减1

count.decrementAndGet() ;

lock.notify();

}

return res ;

}

public static void main(String[] args) {

final Queue mq = new Queue(3) ;

mq.put("a");

mq.put("b");

mq.put("c");

new Thread(new Runnable() {

@Override

public void run() {

mq.put("g");

System.out.println("put1 secceseful");

mq.put("f");

System.out.println("put2 secceseful");

}

}).start();

new Thread(new Runnable() {

@Override

public void run() {

System.out.println("take value = "+mq.take() );

}

}).start();

}

}

运行结果如下:

take value = a

put1 secceseful

执行第一个put的时候由于队列容量已经满了,所以线程阻塞。另一个线程take之后,阻塞的线程继续执行put成功。

java 多队列_java多线程实现简单队列相关推荐

  1. java点名代码滚动_JAVA多线程实现简单的点名系统

    效果图如下: CMain函数: package com.shubing.main; public class CMain { public static void main(String[] args ...

  2. java线程池_Java多线程并发:线程基本方法+线程池原理+阻塞队列原理技术分享...

    线程基本方法有哪些? 线程相关的基本方法有 wait,notify,notifyAll,sleep,join,yield 等. 线程等待(wait) 调用该方法的线程进入 WAITING 状态,只有等 ...

  3. java环形数组_Java数组模拟环形队列

    1.假溢出 ​系统作为队列用的存储区还没有满,但队列却发生了溢出,我们把这种现象称为"假溢出". 因为队列遵从从队尾存入数据,从队头取数据,所以红框部分的空间就不能继续存入新的数据 ...

  4. java线程钥匙_Java多线程并发编程/锁的理解

    一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等 ...

  5. 简述java的线程_Java多线程的简述

    线程与进程 进程: ​ 是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程:进程也是程序的一次执行过程,是系统运行程序的基本单位:系统运行一个程序即是一个进 ...

  6. java 线程 组成_java多线程

    一:基本知识点 1.1线程与进程区别: 1.进程是资源分配的最小单位,线程是CPU调度的最小单位 2.一个进程由一个或多个线程组成 3.进程之间相互独立,每个进程都有独立的代码和数据空间,但同一进程下 ...

  7. java 线程分组_Java多线程可以分组,还能这样玩!

    前面的文章,栈长和大家分享过多线程创建的3种方式<实现 Java 多线程的 3 种方式>. 但如果线程很多的情况下,你知道如何对它们进行分组吗? 和 Dubbo 的服务分组一样,Java ...

  8. java多线程队列_java多线程消费者生产者模式(BlockingQueue 通过阻塞队列实现)

    import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; /** * Cr ...

  9. java多线程消息队列_java多线程消息队列的实现

    1.定义一个队列缓存池: private static List queueCache = new LinkedList(); 2.定义队列缓冲池最大消息数,如果达到该值,那么队列检入将等待检出低于该 ...

最新文章

  1. Ruby开发环境配置
  2. java 中常用方法_java_中常用的方法总结
  3. 区块链第二层扩容方案Plasma和Rollups
  4. Docker的安装和使用说明——Docker for Windows
  5. 【JAVA基础篇】String类详解
  6. XILINX ZYNQ7100 的上电顺序
  7. jQuery 属性操作 - addClass() 和 removeClass() 方法
  8. node.js + express服务端,客户端请求图片,在浏览器出现乱码解决方案
  9. GD32 笔记 01:如何用 Keil 新建 GD32E230 工程
  10. 与大家分享一些计算机方面的电子书籍
  11. zbrush中减面操作
  12. 软工作业 4:结对项目之词频统计——基本功能
  13. SVAC1.0逆扫描反变换反量化分析
  14. B站UP主发起停更潮
  15. java 摄像头 视频_javaCV-摄像头实时视频
  16. 第七史诗无限显示服务器连接中,第七史诗神器满破是什么意思?神器满破攻略...
  17. 高可用网络架构的部署
  18. 解决方案 因为计算机同名,无法发现工作组内其他计算机。
  19. 2019伯克利中美峰会 | 2019峰会揭秘 峰会历程回顾 售票通道
  20. 最新款打卡抽奖助手小程序源码,带微信通知功能,去授权

热门文章

  1. 【clickhouse】clickhouse : Suspiciously many broken parts to remove.: Cannot attach table default
  2. 【Arthas】Arthas使用watch命令(生产上查看方法出入参)
  3. JVM : VisualVM 排查内存泄漏的问题
  4. 95-130-342-源码-source-kafka相关-AbstractPartitionDiscoverer
  5. 【Flink】Flink ClosureCleaner 闭包清除
  6. kafka报错:Error writing out kafka.log:type=Log,name=LogStartOffset,topic=xx EofException
  7. Current HIVE_LIB is not valid, please export HIVE_LIB='YOUR_LOCAL_HIVE_LIB'
  8. 经过两个月的面试,我给你整理了这些面试考点(Java版)
  9. 阿里P7三面被这10个SpringCloud微服务问题难倒,杯具!
  10. Java冒泡,选择,插入排序算法