实现代码:
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线程聊天室(阻塞队列实现)】 在Java编程中,多线程是构建并发应用程序的关键技术。在创建一个线程聊天室时,我们通常会涉及到多个线程之间的交互,例如用户发送消息、接收消息以及处理网络通信等。而阻塞...
在提供的代码实例中,我们看到了一个简单的阻塞队列实现,使用了`LinkedList`作为底层数据结构,并通过`synchronized`关键字来实现线程安全。`enqueue`方法用于向队列尾部添加元素,`dequeue`方法用于从队列头部移除...
在"阻塞队列实现生产者消费者模式Java开发Java经验技巧共4页.pdf.zip"这个压缩包中,很可能是详细介绍了如何使用Java的阻塞队列来构建生产者消费者模式,可能包括以下知识点: 1. **阻塞队列接口**:首先,会介绍`...
Java中的`java.util.concurrent`包提供了多种阻塞队列实现,如`ArrayBlockingQueue`, `LinkedBlockingQueue`, `PriorityBlockingQueue`等。 ### 生产者消费者模型 生产者消费者模型是并发设计模式的一种,用于协调...
在Java中,`java.util.concurrent`包提供了多种阻塞队列实现,如`ArrayBlockingQueue`, `LinkedBlockingQueue`等。它们都实现了`BlockingQueue`接口,提供了一套线程安全的方法来添加和移除元素,如`put()`, `take()...
基于c++11的轻量级Web并发服务器,使用Epoll与Reactor高并发模型,基于小根堆实现了定时器,利用单例模式与阻塞队列实现异步的日志系统.zip优质项目,资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松...
Java阻塞队列实现原理及实例解析 Java阻塞队列是一种特殊的队列,它能够在队列为空或满时阻塞线程,使得线程之间能够更好地协作和通信。阻塞队列的实现原理是基于锁机制和条件变量机制的,通过wait和notify方法来...
Java中的阻塞队列实现主要依赖于`java.util.concurrent`包下的几个类,如`BlockingQueue`接口、`ArrayBlockingQueue`、`LinkedBlockingQueue`等。`BlockingQueue`接口定义了一组操作,如`put`、`take`、`offer`等,...
Java中的ArrayBlockingQueue和LinkedBlockingQueue都是典型的阻塞队列实现。 阻塞队列为线程间通信提供了便捷的机制,可以用来协调多个线程的运行,防止多线程直接访问共享资源导致的并发问题。例如,生产者-消费者...
以下是一个基于`wait()`和`notify()`的简单阻塞队列实现: ```java public class SimpleBlockQueue<T> { private int capacity; private LinkedList<T> queue = new LinkedList(); private int count; ...
常见的阻塞队列实现包括ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue等。阻塞队列常被用作线程池的工作队列,连接生产者(添加任务的线程)和消费者(执行任务的线程),实现任务的异步处理。 ...
C++11 实现的阻塞队列 C++11 中的阻塞队列是指在多线程环境下,实现生产者消费者模式的队列。阻塞队列的实现需要解决两个问题:线程安全和阻塞机制。在 C++11 中,我们可以使用 std::mutex、std::condition_...
### 10、阻塞队列BlockingQueue 实战及其原理分析 #### 一、阻塞队列概述 阻塞队列(BlockingQueue)是Java语言中...通过对不同阻塞队列实现的理解和掌握,可以更好地设计和优化高并发系统,提升系统的稳定性和性能。
Java中常见的阻塞队列实现包括: 1. `ArrayBlockingQueue`: 一个基于固定大小数组的阻塞队列,公平或非公平的锁策略可选。 2. `LinkedBlockingQueue`: 基于链表结构的阻塞队列,容量可以无限大,但内部维护了一个...
### 高性能阻塞队列的数据结构创新 #### 一、阻塞队列的概念与应用 **阻塞队列**是一种特殊的队列,它具备线程安全的特点,...在实际应用中,可以根据具体场景选择合适的阻塞队列实现方式,以达到最佳的并发效果。
ArrayBlockingQueue是一个基于固定数组实现的阻塞队列。它的容量在创建时就需要指定,并且不可变。队列内部采用双指针机制,一个指向头部,一个指向尾部,进行元素的入队和出队操作。ArrayBlockingQueue支持公平和非...
Java 1.5引入的`java.util.concurrent`包提供了一些内置的阻塞队列实现,主要包括: 1. **ArrayBlockingQueue**:基于固定大小的数组实现,插入和删除操作都具有O(1)的时间复杂度。队列的公平性可以在构造时选择,...
本实例中使用了`ArrayBlockingQueue`,这是最常用的阻塞队列实现之一,它是一个有界队列,能够按FIFO(先进先出)的顺序处理元素。创建`ArrayBlockingQueue`时,需要指定队列的容量,这有助于防止内存溢出,因为队列...
`LinkedBlockingQueue` 同样是 `java.util.concurrent` 包下的一个线程安全的阻塞队列实现,它继承自 `AbstractQueue` 并实现了 `BlockingQueue` 接口。`LinkedBlockingQueue` 的特点是可以在队列满时阻塞生产者线程...