`

ArrayBlockingQueue的用法(5)

阅读更多
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();
    }
    /**
     * 总结:上面的代码没有原子性,打印的结果可能会出现偏差
     */
}

 

0
0
分享到:
评论

相关推荐

    ArrayBlockingQueue源码分析.docx

    除了上述方法外,`ArrayBlockingQueue` 还提供了 `peek()`(查看但不移除队首元素)、`remainingCapacity()`(查询剩余容量)等方法,方便在并发环境中进行各种操作。 通过以上分析,我们可以看到 `...

    详细分析Java并发集合ArrayBlockingQueue的用法

    Java并发集合ArrayBlockingQueue的用法详解 Java并发集合ArrayBlockingQueue是Java并发集合框架下的一个重要组件,它提供了阻塞队列的实现,用于多线程环境下的并发操作。下面是对ArrayBlockingQueue的用法详解: ...

    Java源码解析阻塞队列ArrayBlockingQueue常用方法

    本文将深入解析ArrayBlockingQueue的常用方法及其内部实现机制。 ArrayBlockingQueue的核心是一个固定大小的数组`items`,用于存储队列中的元素。此外,它还有3个关键的索引变量:`takeIndex`、`putIndex`和`count`...

    ArrayBlockingQueue源码解析-动力节点共

    在本文中,我们将深入分析ArrayBlockingQueue的源码,探讨其内部实现机制、特性以及如何在实际应用中高效地使用它。 首先,ArrayBlockingQueue是一个有界的阻塞队列,这意味着它有一个固定的容量限制。在创建时必须...

    并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解

    ArrayBlockingQueue内部使用数组存储元素,使用ReentrantLock来保证线程安全,使用Condition来实现可阻塞式的插入和删除元素操作。其主要属性包括: * items数组:用于存储队列元素 * takeIndex和putIndex:分别...

    java并发之ArrayBlockingQueue详细介绍

    ArrayBlockingQueue使用ReentrantLock和两个Condition来实现线程安全的操作。ReentrantLock是Java并发编程中常用的锁实现,它可以重入锁,允许同一个线程多次获得锁。两个Condition分别是notEmpty和notFull,用于...

    Java concurrency集合之ArrayBlockingQueue_动力节点Java学院整理

    ArrayBlockingQueue是Java并发编程中一个重要的集合类,它属于 BlockingQueue 接口的一个实现,主要特点是线程安全、有界以及基于...了解并熟练掌握其工作原理和使用方法,对于编写高并发、高性能的Java应用至关重要。

    26不让我进门,我就在门口一直等!—BlockingQueue和ArrayBlockingQueue.pdf

    这种机制使得BlockingQueue非常适合在生产者-消费者模型中使用,因为它能够自动同步生产者和消费者的执行。 BlockingQueue接口提供了多种入队(添加元素)和出队(移除元素)的方法: 1. `boolean add(E e)`:...

    java中LinkedBlockingQueue与ArrayBlockingQueue的异同

    5. **计数方式**:`LinkedBlockingQueue`使用`AtomicInteger`来原子性地更新元素计数,而`ArrayBlockingQueue`使用简单的`int`变量,但这种方式在多线程环境下可能会带来竞态条件,因此在`ArrayBlockingQueue`中,...

    Java源码解析阻塞队列ArrayBlockingQueue介绍

    5. await方法的作用 在ArrayBlockingQueue中,await方法用于Condition对象的阻塞机制。当线程调用await方法时,当前线程会释放锁,并进入阻塞状态,直到其他线程调用signal方法时,线程才会被唤醒。await方法的作用...

    Java可阻塞队列-ArrayBlockingQueue

     ArrayBlockingQueue提供的增加和取出方法总结  使用ArrayBlockingQueue的一个子类BlockingQueue实现一个可阻塞队列,一个线程put另一个线程take,当队列为空时take等待,当线程满时put等待  

    Java源码解析阻塞队列ArrayBlockingQueue功能简介

    ArrayBlockingQueue的使用场景非常广泛,例如在生产者-消费者模型中,生产者可以将元素添加到队列中,而消费者可以从队列中获取元素。在并发编程中,ArrayBlockingQueue可以用来实现线程安全的队列操作。 ...

    spring-blockingqueue:用Spring Boot阻止队列

    通常,我们会选择实现BlockingQueue的类,如ArrayBlockingQueue、LinkedBlockingQueue或PriorityBlockingQueue,根据实际需求选择合适的实现。 例如,我们可以创建一个配置类,如下所示: ```java @Configuration ...

    Android开发经验谈:并发编程(线程与线程池)(推荐)

    Android开发经验谈:并发编程(线程与线程池) Android开发中,线程和线程池是两个非常重要的概念。...* ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue等队列的使用方法

    阻塞队列阻塞队列阻塞队列

    在Java编程语言中,阻塞队列是一种线程安全的数据结构,它在多线程并发控制中发挥着重要作用。阻塞队列的核心特性是当队列为空时,尝试...了解和掌握这些阻塞队列的特性和使用方法,对于优化并发程序的性能至关重要。

    java中线程队列BlockingQueue的用法

    下面我们将深入探讨`BlockingQueue`的用法及其相关知识点。 1. **接口定义与实现** `BlockingQueue`是Java中的一个接口,它继承自`Queue`接口,并添加了阻塞操作。Java提供了一些内置的实现类,如`...

    详细分析Java并发集合LinkedBlockingQueue的用法

    详细分析Java并发集合LinkedBlockingQueue的用法 Java并发集合LinkedBlockingQueue是Java并发集合中的一种阻塞队列实现,使用链表方式实现的阻塞队列。LinkedBlockingQueue的实现主要包括链表实现、插入和删除节点...

Global site tag (gtag.js) - Google Analytics