package com.yonge.lock;
import java.util.Random;
import java.util.concurrent.ArrayBlockingQueue;
/**
* 需求:一个线程向一个固定大小的队列里面不停地存放数据,另一个线程不停的向这个队列里面取数据,
* 当队列满了,还继续存放数据,此时出现阻塞,直到队列有空闲的位置;
* 反之,当队列为空,还继续取数据,则也出现阻塞,知道队列中有数据为止
* @author wb-gaoy
* @version $Id: ArrayBlockingQueueTest.java,v 0.1 2012-1-6 上午10:54:11 wb-gaoy Exp $
*/
public class ArrayBlockingQueueTest {
/**
* @param args
*/
public static void main(String[] args) {
//定义阻塞队列
final ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(5);
//开启一个put数据的线程
new Thread(new Runnable() {
int i = 0;
@Override
public void run() {
while (true) {
try {
System.out.println("ThreadName:" + Thread.currentThread().getName()
+ ":队列中已存在" + queue.size() + "元素");
if (queue.size() == 5) {
System.out.println("ThreadName:" + Thread.currentThread().getName()
+ ":队列已经满了,阻塞中...");
}
Thread.sleep((long) Math.random() * 10000);
i = new Random().nextInt(100);
System.out.println("ThreadName:" + Thread.currentThread().getName()
+ "准备存放的值为:" + i);
queue.put(i);
System.out.println("ThreadName:" + Thread.currentThread().getName()
+ "已存放的值为:" + i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "A").start();
//开启一个take数据的线程
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
System.out.println("ThreadName:" + Thread.currentThread().getName()
+ ":队列中已存在" + queue.size() + "元素");
if (queue.size() == 0) {
System.out.println("ThreadName:" + Thread.currentThread().getName()
+ ":队列已经空了,阻塞中...");
}
Thread.sleep((long) Math.random() * 10000);
System.out.println("ThreadName:" + Thread.currentThread().getName()
+ "获取的值为:" + queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "B").start();
}
/**
* 总结:上面的代码没有原子性,打印的结果可能会出现偏差
*/
}
分享到:
相关推荐
除了上述方法外,`ArrayBlockingQueue` 还提供了 `peek()`(查看但不移除队首元素)、`remainingCapacity()`(查询剩余容量)等方法,方便在并发环境中进行各种操作。 通过以上分析,我们可以看到 `...
Java并发集合ArrayBlockingQueue的用法详解 Java并发集合ArrayBlockingQueue是Java并发集合框架下的一个重要组件,它提供了阻塞队列的实现,用于多线程环境下的并发操作。下面是对ArrayBlockingQueue的用法详解: ...
本文将深入解析ArrayBlockingQueue的常用方法及其内部实现机制。 ArrayBlockingQueue的核心是一个固定大小的数组`items`,用于存储队列中的元素。此外,它还有3个关键的索引变量:`takeIndex`、`putIndex`和`count`...
在本文中,我们将深入分析ArrayBlockingQueue的源码,探讨其内部实现机制、特性以及如何在实际应用中高效地使用它。 首先,ArrayBlockingQueue是一个有界的阻塞队列,这意味着它有一个固定的容量限制。在创建时必须...
ArrayBlockingQueue内部使用数组存储元素,使用ReentrantLock来保证线程安全,使用Condition来实现可阻塞式的插入和删除元素操作。其主要属性包括: * items数组:用于存储队列元素 * takeIndex和putIndex:分别...
ArrayBlockingQueue使用ReentrantLock和两个Condition来实现线程安全的操作。ReentrantLock是Java并发编程中常用的锁实现,它可以重入锁,允许同一个线程多次获得锁。两个Condition分别是notEmpty和notFull,用于...
ArrayBlockingQueue是Java并发编程中一个重要的集合类,它属于 BlockingQueue 接口的一个实现,主要特点是线程安全、有界以及基于...了解并熟练掌握其工作原理和使用方法,对于编写高并发、高性能的Java应用至关重要。
这种机制使得BlockingQueue非常适合在生产者-消费者模型中使用,因为它能够自动同步生产者和消费者的执行。 BlockingQueue接口提供了多种入队(添加元素)和出队(移除元素)的方法: 1. `boolean add(E e)`:...
5. **计数方式**:`LinkedBlockingQueue`使用`AtomicInteger`来原子性地更新元素计数,而`ArrayBlockingQueue`使用简单的`int`变量,但这种方式在多线程环境下可能会带来竞态条件,因此在`ArrayBlockingQueue`中,...
5. await方法的作用 在ArrayBlockingQueue中,await方法用于Condition对象的阻塞机制。当线程调用await方法时,当前线程会释放锁,并进入阻塞状态,直到其他线程调用signal方法时,线程才会被唤醒。await方法的作用...
ArrayBlockingQueue提供的增加和取出方法总结 使用ArrayBlockingQueue的一个子类BlockingQueue实现一个可阻塞队列,一个线程put另一个线程take,当队列为空时take等待,当线程满时put等待
ArrayBlockingQueue的使用场景非常广泛,例如在生产者-消费者模型中,生产者可以将元素添加到队列中,而消费者可以从队列中获取元素。在并发编程中,ArrayBlockingQueue可以用来实现线程安全的队列操作。 ...
通常,我们会选择实现BlockingQueue的类,如ArrayBlockingQueue、LinkedBlockingQueue或PriorityBlockingQueue,根据实际需求选择合适的实现。 例如,我们可以创建一个配置类,如下所示: ```java @Configuration ...
Android开发经验谈:并发编程(线程与线程池) Android开发中,线程和线程池是两个非常重要的概念。...* ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue等队列的使用方法
在Java编程语言中,阻塞队列是一种线程安全的数据结构,它在多线程并发控制中发挥着重要作用。阻塞队列的核心特性是当队列为空时,尝试...了解和掌握这些阻塞队列的特性和使用方法,对于优化并发程序的性能至关重要。
下面我们将深入探讨`BlockingQueue`的用法及其相关知识点。 1. **接口定义与实现** `BlockingQueue`是Java中的一个接口,它继承自`Queue`接口,并添加了阻塞操作。Java提供了一些内置的实现类,如`...
详细分析Java并发集合LinkedBlockingQueue的用法 Java并发集合LinkedBlockingQueue是Java并发集合中的一种阻塞队列实现,使用链表方式实现的阻塞队列。LinkedBlockingQueue的实现主要包括链表实现、插入和删除节点...