看了下JDK的源代码实现,模拟了一下ArrayBlockQueue,代码如下:
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class BlockQueue {
private List<Integer> list;
private int size;
private final ReentrantLock lock;
private final Condition isEmpty;
private final Condition isFull;
public BlockQueue(int size) {
this.size = size;
list = new LinkedList<Integer>();
lock = new ReentrantLock();
isEmpty = lock.newCondition();
isFull = lock.newCondition();
}
public void put(int data) throws InterruptedException {
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
try {
while (list.size() == size) {
try {
isFull.await();
} catch (InterruptedException e) {
isFull.signal();
throw e;
}
}
list.add(data);
System.out.println("size : " + list.size() + ", " + Thread.currentThread().getName() + " put " + data);
isEmpty.signal();
} finally {
lock.unlock();
}
}
public int take() throws InterruptedException {
lock.lockInterruptibly();
try {
while (list.size() == 0) {
try {
isEmpty.await();
} catch (InterruptedException e) {
isEmpty.signal();
throw e;
}
}
int data = list.remove(0);
System.out.println("size : " + list.size() + ", " + Thread.currentThread().getName() + " get " + data);
isFull.signal();
return data;
} finally {
lock.unlock();
}
}
}
import java.util.Random;
public class Producer implements Runnable {
private BlockQueue bq;
private String name;
public Producer(String name, BlockQueue bq) {
this.name = name;
this.bq = bq;
}
@Override
public void run() {
Random ran = new Random();
for(int i = 0; i < 10; i++){
int data = ran.nextInt(20);
try {
bq.put(data);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//System.out.println(name + " put " + data);
}
}
}
public class Consumer implements Runnable {
private BlockQueue bq;
private String name;
public Consumer(String name, BlockQueue bq) {
this.bq = bq;
this.name = name;
}
@Override
public void run() {
for(int i = 0; i < 10; i++){
int data;
try {
data = bq.take();
//System.out.println(name + " get " + data);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
import org.junit.Test;
public class BlockQueueTest {
@Test
public void test() throws InterruptedException {
BlockQueue bq = new BlockQueue(5);
Producer p1 = new Producer("producer 1", bq);
Producer p2 = new Producer("producer 2", bq);
Producer p3 = new Producer("producer 3", bq);
Consumer c1 = new Consumer("consumer 1", bq);
Consumer c2 = new Consumer("consumer 2", bq);
Consumer c3 = new Consumer("consumer 3", bq);
new Thread(p1).start();
new Thread(p2).start();
new Thread(p3).start();
new Thread(c1).start();
new Thread(c2).start();
new Thread(c3).start();
Thread.sleep(10000);
}
}
运行结果如下:
size : 1, Thread-0 put 15
size : 2, Thread-0 put 0
size : 3, Thread-0 put 18
size : 4, Thread-0 put 9
size : 5, Thread-0 put 6
size : 4, Thread-3 get 15
size : 3, Thread-5 get 0
size : 2, Thread-5 get 18
size : 1, Thread-5 get 9
size : 0, Thread-5 get 6
size : 1, Thread-1 put 12
size : 0, Thread-4 get 12
size : 1, Thread-0 put 3
size : 2, Thread-2 put 2
size : 3, Thread-2 put 13
size : 4, Thread-2 put 12
size : 5, Thread-2 put 14
size : 4, Thread-5 get 3
size : 3, Thread-5 get 2
size : 2, Thread-5 get 13
size : 1, Thread-5 get 12
size : 0, Thread-5 get 14
size : 1, Thread-1 put 0
size : 2, Thread-1 put 3
size : 3, Thread-1 put 19
size : 4, Thread-1 put 13
size : 5, Thread-1 put 2
size : 4, Thread-4 get 0
size : 3, Thread-4 get 3
size : 2, Thread-4 get 19
size : 1, Thread-4 get 13
size : 0, Thread-4 get 2
size : 1, Thread-2 put 1
size : 2, Thread-2 put 9
size : 3, Thread-2 put 10
size : 4, Thread-2 put 14
size : 5, Thread-2 put 3
size : 4, Thread-5 get 1
size : 3, Thread-3 get 9
size : 2, Thread-3 get 10
size : 1, Thread-3 get 14
size : 0, Thread-3 get 3
size : 1, Thread-1 put 17
size : 2, Thread-1 put 14
size : 3, Thread-1 put 1
size : 4, Thread-1 put 10
size : 3, Thread-4 get 17
size : 2, Thread-4 get 14
size : 1, Thread-4 get 1
size : 0, Thread-4 get 10
size : 1, Thread-2 put 6
size : 2, Thread-0 put 1
size : 3, Thread-0 put 14
size : 4, Thread-0 put 9
size : 5, Thread-0 put 4
size : 4, Thread-3 get 6
size : 3, Thread-3 get 1
size : 2, Thread-3 get 14
size : 1, Thread-3 get 9
size : 0, Thread-3 get 4
说明:在Producer和Consumer线程里面打印语句的显示结果很令人迷惑,改成在BlockQueue里面打印就好了。
分享到:
相关推荐
在Java中,有几个实现了BlockingQueue接口的类,如ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue等,它们各有特点: 1. **ArrayBlockingQueue**:基于数组的有界阻塞队列,容量固定,插入和删除...
通常,我们会选择实现BlockingQueue的类,如ArrayBlockingQueue、LinkedBlockingQueue或PriorityBlockingQueue,根据实际需求选择合适的实现。 例如,我们可以创建一个配置类,如下所示: ```java @Configuration ...
`BlockingQueue`接口有几个具体实现类,根据不同的应用场景可以选择不同的实现: - **ArrayBlockingQueue**: 一种固定大小的`BlockingQueue`,在构造时需要指定其容量大小。队列中的元素按照FIFO(先进先出)原则...
实现BlockingQueue的类 Java并发包 `java.util.concurrent` 中提供了一些实现 BlockingQueue 的类,如 `ArrayBlockingQueue`、`LinkedBlockingQueue` 和 `PriorityBlockingQueue` 等。这些类各有特点,适用于不同...
现在我们来详细讨论如何利用这些技术实现“BlockingQueue队列自定义超时时间取消线程池任务”。 首先,`BlockingQueue`是一个并发容器,它遵循先进先出(FIFO)原则,具有阻塞性质,当队列满时,生产者线程会被阻塞...
《C++实现的跨平台BlockingQueue详解》 在软件开发中,线程间的通信和同步是必不可少的部分。Java中的`BlockingQueue`是一个高效且常用的并发工具类,它提供了线程安全的数据结构,允许一个线程放入元素,而另一个...
在多线程环境下,BlockingQueue能够有效地实现生产者-消费者模式,提高了程序的并发性能和效率。本文将深入探讨BlockingQueue的使用、特性以及常见操作。 首先, BlockingQueue接口位于`java.util.concurrent`包下...
目标是在接近零开销的情况下实现极低的延迟。 如何使用我们的低延迟有界队列之一的示例。 // writer thread Executors.newSingleThreadExecutor().execute(new Runnable() { @Override public void run() { ...
### BlockingQueue(阻塞队列)详解 #### 一、前言 随着现代软件系统对并发性能需求的不断提高,多线程编程技术逐渐成为开发人员不可或缺的技能之一。在Java平台中,`java.util.concurrent`包提供了丰富的工具来...
本文将深入探讨BlockingQueue的工作原理、常见实现、使用场景以及代码示例。 在Java并发编程中,BlockingQueue是一个非常重要的接口,它提供了线程安全的队列操作,特别是在生产者-消费者模式中发挥着核心作用。本文...
"java并发学习之BlockingQueue实现生产者消费者详解" BlockingQueue是Java util.concurrent包下重要的数据结构,提供了线程安全的队列访问方式。在多线程应用中,常用于生产-消费场景。BlockingQueue有多种实现,...
BlockingQueue 是 Java 并发集合框架中的一种阻塞队列实现,提供了高效的并发操作和线程安全机制。它可以实现生产者-消费者模式,用于在多线程环境中实现高效的数据生产和消费。 BlockingQueue 的特点包括: * ...
`BlockingQueue`实现了一种线程安全的数据结构,它能够有效地协调生产者和消费者的动作,实现高效的并发操作。在这个场景中,生产者负责向队列中添加元素,而消费者则负责从队列中取出并处理这些元素。 `...
`BlockingQueue`接口位于`java.util.concurrent`包中,提供了线程安全的数据结构,可以用于实现生产者-消费者模型、线程间的通信以及有效地管理共享资源。下面我们将深入探讨`BlockingQueue`的用法及其相关知识点。 ...
BlockingQueue 的核心设计是其在并发环境下提供了高效的同步机制,实现了生产者-消费者模式。 BlockingQueue 支持以下两种附加操作: 1. 当 Queue 为空时,调用 `take()` 或 `poll()` 方法尝试获取元素的线程会被...
总的来说,`Java`的`BlockingQueue`是实现并发和多线程间数据共享的有效工具,它通过阻塞机制提供了高效且线程安全的通信途径,尤其在处理生产者-消费者问题时,大大简化了编程复杂性。了解并熟练掌握`BlockingQueue...
Java多线程BlockingQueue实现生产者消费者模型详解 Java多线程中,生产者消费者模型是非常重要的一种设计模式,它可以解决多线程之间的数据传输问题。在Java中,我们可以使用BlockingQueue来实现生产者消费者模型,...
BlockingQueue的一些常见实现包括ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue等,每种实现都有其特定的性能特性和使用场景。例如,ArrayBlockingQueue是基于数组的,提供了固定容量,而...
`BlockingQueue`有多种具体的实现,包括: 1. `ArrayBlockingQueue`:固定大小的队列,使用数组实现,具有较好的性能,但插入和删除操作可能不如链表实现的快速。 2. `LinkedBlockingQueue`:基于链表的实现,大小可...
在实际应用中,`BlockingQueue`和`BlockingDeque`常被用来实现工作队列、缓存、线程池等并发组件,例如`ThreadPoolExecutor`就利用`BlockingQueue`来存储等待执行的任务。 理解`BlockingQueue`和`BlockingDeque`的...