通过简单实现一个阻塞队列了解ReentraintLock
MyBlockingQueue 代码
package com.kms.test; import java.util.LinkedList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock; public class MyBlockingQueue<E> { LinkedList<E> list;
int size; // 队列大小,可指定,默认为16 ReentrantLock lock = new ReentrantLock(); // 可重入锁
Condition nonFull = lock.newCondition(); // 非满条件
Condition nonEmpty = lock.newCondition(); // 非空条件 MyBlockingQueue(){
this(16);
} MyBlockingQueue(int size){
this.size = size;
this.list = new LinkedList();
} public void enqueue(E e) throws InterruptedException{
lock.lock();
try{
while(list.size() == size){
System.out.println("队列已满,当前数量为: "+list.size());
nonFull.await();
}
list.add(e);
System.out.println("入队: "+e);
nonEmpty.signal(); // 非空,唤醒在nonEmpty条件上等待的线程
}finally{
lock.unlock();
}
} public E dequeue() throws InterruptedException{
lock.lock();
try{
while(list.size() == 0){
System.out.println("队列为空");
nonEmpty.await();
}
E e = list.pop();
System.out.println("出队: "+e);
nonFull.signal(); // 唤醒在nonFull条件上等待的线程
return e;
}finally{
lock.unlock();
}
} }
简单测试类
package com.kms.test;
public class Test7 {
static MyBlockingQueue queue = new MyBlockingQueue<Integer>();
public static void main(String[] args) {
// TODO Auto-generated method stub
new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(3000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
for(int i = 0; i < 3; i++){
try {
queue.dequeue();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
for(int i = 0; i < 20; i ++){
try {
queue.enqueue(new Integer(i));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
运行结果

通过简单实现一个阻塞队列了解ReentraintLock的更多相关文章
- 利用ReentrantLock简单实现一个阻塞队列
借助juc里的ReentrantLock实现一个阻塞队列结构: package demo.concurrent.lock.queue; import java.util.concurrent.lock ...
- 进阶高阶IoT架构-教你如何简单实现一个消息队列
前言 消息队列是软件系统领域用来实现系统间通信最广泛的中间件.基于消息队列的方式是指由应用中的某个系统负责发送消息,由关心这条消息的相关系统负责接收消息,并在收到消息后进行各自系统内的业务处理.消息可 ...
- 用Java如何设计一个阻塞队列,然后说说ArrayBlockingQueue和LinkedBlockingQueue
前言 用Java如何设计一个阻塞队列,这个问题是在面滴滴的时候被问到的.当时确实没回答好,只是说了用个List,然后消费者再用个死循环一直去监控list的是否有值,有值的话就处理List里面的内容.回 ...
- 16_Queue_利用wait()和notify()编写一个阻塞队列
[线程间通信概念] 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体,线程间的通信就成为整体必用方式之一.当线程存在通信指挥,线程间的交互性会更强大,在提高CPU利用率的同 ...
- 使用 ReentrantLock 和 Condition 实现一个阻塞队列
前言 从之前的阻塞队列的源码分析中,我们知道,JDK 中的阻塞队列是使用 ReentrantLock 和 Condition 实现了,我们今天来个简易版的.代码如下: 代码 public class ...
- 浅谈Java中的Condition条件队列,手摸手带你实现一个阻塞队列!
条件队列是什么?可能很多人和我一样答不出来,不过今天终于搞清楚了! 什么是条件队列 条件队列:当某个线程调用了wait方法,或者通过Condition对象调用了await相关方法,线程就会进入阻塞状态 ...
- 阻塞队列 - java基于链表的简单实现
1.阻塞队列的原理 阻塞队列与普通队列的区别在于:阻塞队列为空时,从队列中获取元素的操作将会被阻塞,当队列为满时,往队列里添加元素的操作会被阻塞. 试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其 ...
- 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题
调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...
- 用阻塞队列实现一个生产者消费者模型?synchronized和lock有什么区别?
多线程当中的阻塞队列 主要实现类有 ArrayBlockingQueue是一个基于数组结构的有界阻塞队列,此队列按FIFO原则对元素进行排序 LinkedBlockingQueue是一个基于链表结构的 ...
- java并发编程:阻塞队列
一.几种主要的阻塞队列 自从Java 1.5之后,在java.util.concurrent包下提供了若干个阻塞队列,主要有以下几个: ArrayBlockingQueue:基于数组实现的一个阻塞队列 ...
随机推荐
- js右键生成菜单
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ubuntu 16.04 安装peach
当前操作系统:ubuntu 16.04 使用 TUNA 的软件源镜像替换sources.list 备份原sources.list文件 sudo cp /etc/apt/sources.list /et ...
- linux 下安装部署redis
安装: 1.获取redis资源 wget http://download.redis.io/releases/redis-4.0.8.tar.gz 2.解压 tar xzvf redis-4. ...
- matplotlib 中文乱码的解决方法
关于报错信息 Glyph 26426 missing from current font. 这个错误的原因是:本地没有可支持中文字体显示的配置文件,所以第一步需要先去下载相关的配置文件. 下载链接 h ...
- 【JavaScript】setAttribute在添加事件时失效解决办法
HTML的表格行高亮,用JavaScript设置时总是在FireFox和谷歌浏览器中成功,但是在IE6,IE7中失败.最后发现是IE系列对DOM的setAttribute方法支持不好.如用: 1 tr ...
- 在vite中怎么批量注册组件
1. 在webpack中使用require来获取组件 / 参数:1. 目录 2. 是否加载子目录 3. 加载的正则匹配 //匹配当前文件夹下的所有.vue文件 注册全局组件 const importF ...
- HTML学习笔记1----HTML是什么
随笔记录方便自己和同路人查阅. #------------------------------------------------我是可耻的分割线--------------------------- ...
- 781. 森林中的兔子 (Medium)
问题描述 781. 森林中的兔子 (Medium) 森林中有未知数量的兔子.提问其中若干只兔子 "还有多少只兔子与你(指被提问的兔子)颜色相同?" ,将答案收集到一个整数数组 an ...
- LaTex【七】latex换行顶格、不缩进
LaTex换行会默认缩进,如果想不缩进只需要在不需要缩进的内容前面加上 \noindent 命令 ababababababababababab \noindent 不缩进不缩进
- 物流扫码固定式扫描相机BXT-10M 自动分拣读码器 条码识别扫码器
物流扫码固定式扫描相机BXT-10M 自动分拣读码器 条码识别扫码器 VX : orihard2014 标签: 条码识别扫码器, 自动分拣读码器, 物流扫码固定式扫描相机, 物流扫码相机