实现代码:
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class BlockingQuery {
private Object[] item;
private int takeIndex, putIndex, count;
private final ReentrantLock lock = new ReentrantLock();
private Condition notFull = lock.newCondition();
private Condition notEmpty = lock.newCondition();
BlockingQuery(int cap) {
if (cap <= 0) {
throw new IllegalArgumentException("init error");
}
item = new Object[cap];
}
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == item.length) {
System.out.println("current count == "+ count + Thread.currentThread().getName()+ " is waiting to put ....");
notFull.await();
}
item[putIndex] = x;
++count;
if (++putIndex == item.length) {
putIndex = 0;
}
System.out.println("current count == "+ count + " is signal others to take ....");
notEmpty.signal();
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
Object obj = null;
lock.lock();
try {
while (count == 0) {
System.out.println("current count == "+ count + Thread.currentThread().getName()+ " is waiting to take ....");
notEmpty.await();
}
obj = item[takeIndex];
--count;
if (++takeIndex == item.length) {
takeIndex = 0;
}
System.out.println("current count == "+ count + " is signal others to put ....");
notFull.signal();
return obj;
} finally {
lock.unlock();
}
}
}
测试代码:
public class BlockingTest {
public static void main(String[] args) {
final BlockingQuery query = new BlockingQuery(10);
//final BlockingQueue<Object> query = new ArrayBlockingQueue<Object>(10);
/**
* 同时启动1000个线程放对象
*
*/
for (int i = 0; i < 1000; i++) {
final int seq = i;
new Thread(new Runnable() {
@Override
public void run() {
try {
query.put("INDEX==" + seq);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
/**
*
* 同时启动1000个线程读取数据
*
*/
for (int i = 0; i < 1000; i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Object obj = query.take();
System.out.println(obj.toString());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
).start();
}
}
}
分享到:
相关推荐
java阻塞队列实现原理及实例解析.docx
阻塞队列实现生产者消费者模式Java开发Java经验技巧共4页.pdf.zip
消息分发框架,基于java阻塞队列实现,生产者消费者模型 可用于任务分发,服务器消息消息,以及网络IO 性能优化,多线程
实现java模拟阻塞队列的例子,该代码包括,阻塞队列实现生产者,消费者。和模拟阻塞队列实现生产者及消费者模式,帮助你更好的理解java多线程
主要介绍了java阻塞队列实现原理及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
运行,登录时,请用两个浏览器登录,应为有不同session,这是跟据session来判断用户的
干扰队列基于干扰器 RingBuffer 的阻塞队列实现
C++是一种面向对象的计算机程序设计语言,由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现(最初这种语言被称作“C with Classes”带类的C)。它是一种静态数据类型检查的、支持多重...
Java实现简单的阻塞队列2种方式,1使用wait(),notify();2使用countdownlatch实现
在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了Dequeue接口)。 使用非阻塞队列的时候有一个很大问题是:它不会对当前线程产生阻塞,那么在面对类似...
主要介绍了剖析Java中阻塞队列的实现原理及应用场景,这里也对阻塞和非阻塞队列的不同之处进行了对比,需要的朋友可以参考下
c++11 实现的阻塞队列
大学操作系统课程 综合实验 单处理器系统的时间片轮转进程调度 算法,使用python实现。带注释。
主要介绍了C++数据结构与算法之双缓存队列实现方法,结合实例形式分析了双缓存队列的原理、实现方法与相关注意事项,需要的朋友可以参考下
阻塞队列是多线程中常用的数据结构,对于实现多线程之间的数据交换、同步等有很大作用。 阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。简而言之,阻塞队列...
主要介绍了详解Java阻塞队列(BlockingQueue)的实现原理,阻塞队列是Java util.concurrent包下重要的数据结构,有兴趣的可以了解一下
首先 LinkedBlockingQueue 是一个 “可选且有界” 的阻塞队列实现,你可以根据需要指定队列的大小。 接下来,我将创建一个 LinkedBlockingQueue ,它最多可以包含100个元素: BlockingQueue<Integer> ...
Nodejs阻塞队列 Nodejs 进程内阻塞 FIFO 队列实现。 具有最大并发的队列。 npm install block-queue 例子 var queue = require ( 'block-queue' ) ; var q = queue ( 1 , function ( task , done ) { // ...
利用单例模式与阻塞队列实现异步的日志系统,记录服务器运行状态; 利用RAII机制实现了数据库连接池,减少数据库连接建立与关闭的开销,同时实现了用户注册登录功能。 增加logsys,threadpool测试单元(todo: timer,...
设备驱动中阻塞与非阻塞及实现:在Linux驱动程序中,我们可以使用等待队列(wait queue)来实现阻塞操作。wait queue很早就作为一个基本的功能单位出现在Linux内核里了,它以队列为基础数据结构,与进程调度机制紧密...