`
wankunde
  • 浏览: 162884 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

阻塞队列使用---ArrayBlockingQueue

 
阅读更多

ArrayBlockingQueue是JAVA5中的一个阻塞队列,能够自定义队列大小,当插入时,如果队列已经没有空闲位置,那么新的插入线程将阻塞到该队列,一旦该队列有空闲位置,那么阻塞的线程将执行插入。从队列中取数据为:take,放数据为:put。下面的例子模拟了两个队列的插入和获取,首先在队列2中插入一个数据,启动线程2向队列2中插入数据时,该线程将阻塞在队列2等待,同时启动线程1向队列1中插入数据,由于队列1此时为空那么能够正确插入,然后从队列2中取数据,当线程1再次插入时,阻塞到队列1,此时,阻塞在队列2的线程2能够插入,并且从队列1中取数据,此时线程1能够插入,如此往复50次,并且每次插入成功后都循环输出10次。代码如下:

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
 
public class ArrayBlockingCommunication {
 
    public static void main(String[] args) {
         
        final Business business = new Business();
         
        new Thread(new Runnable(){
 
            public void run() {
                for(int i=0; i<50; i++){
                    business.sub(i);
                }
            }
             
        }).start();
         
         
        new Thread(new Runnable(){
 
            public void run() {
                for(int i=0; i<50; i++){
                    business.main(i);
                }
            }
             
        }).start();
         
    }
     
     
     
    static class Business{
         
        BlockingQueue<Integer> queue1 = new ArrayBlockingQueue<Integer>(1);
        BlockingQueue<Integer> queue2 = new ArrayBlockingQueue<Integer>(1);
 
        {
            try{
                queue2.put(1);
            }catch(Exception e){
                e.printStackTrace();
            }
        }
         
        public void sub(int i){
             
             
            try {
                queue1.put(1);
                System.out.println("线程" + Thread.currentThread().getName() + 
                "正在阻塞");
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("线程" + Thread.currentThread().getName() + 
            "开始运行");
            for(int j=1; j<=10; j++){
                System.out.println("sub thread sequence is " + j + " loop of " + i);
            }
            try {
                queue2.take();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
         
         
         
        public void main(int i){
             
            try {
                queue2.put(1);
                System.out.println("线程" + Thread.currentThread().getName() + 
                        "正在阻塞");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程" + Thread.currentThread().getName() + 
            "开始运行");
            for(int j=1; j<=10; j++){
                System.out.println("main thread sequence is " + j + " loop of " + i);
            }
            try {
                queue1.take();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
 
}
 

请大家注意:在Business类中有一个匿名构造函数,其特点如下:

匿名构造方法,在任何构造方法之前被调用。这样保证我们初始化Business类时已经向队列2中插入了数据,这样执行起来保证我们看到的线程1先运行,然后是线程2。


转自:http://www.cnblogs.com/belen/archive/2012/04/13/2446019.html  尊重版权

 

分享到:
评论

相关推荐

    Java可阻塞队列-ArrayBlockingQueue

    在前面的的文章,写了一个带有缓冲区的队列,是用JAVA的Lock下的...  使用ArrayBlockingQueue的一个子类BlockingQueue实现一个可阻塞队列,一个线程put另一个线程take,当队列为空时take等待,当线程满时put等待  

    并发-线程池和阻塞队列.pdf

    Java中的ArrayBlockingQueue和LinkedBlockingQueue都是典型的阻塞队列实现。 阻塞队列为线程间通信提供了便捷的机制,可以用来协调多个线程的运行,防止多线程直接访问共享资源导致的并发问题。例如,生产者-消费者...

    支持多线程和泛型的阻塞队列

    阻塞队列是一种在多线程编程中广泛使用的并发数据结构,它在计算机科学和编程领域,特别是Java和C++等面向对象语言中扮演着重要角色。标题中的“支持多线程和泛型的阻塞队列”意味着我们讨论的是一个能够同时处理多...

    并发-线程池和阻塞队列

    常见的阻塞队列实现包括ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue等。阻塞队列常被用作线程池的工作队列,连接生产者(添加任务的线程)和消费者(执行任务的线程),实现任务的异步处理。 ...

    14-阻塞队列BlockingQueue实战及其原理分析二.pdf

    1. ArrayBlockingQueue:使用数组作为底层数据结构的阻塞队列。 2. LinkedBlockingQueue:使用链表作为底层数据结构的阻塞队列。 3. SynchronousQueue:一个不存储元素的阻塞队列,生产者和消费者需要同时存在。 4. ...

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

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

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

    Java中的ArrayBlockingQueue是一个高效的并发数据结构,它是Java并发包`java.util.concurrent`下的一个阻塞队列。本文将深入解析ArrayBlockingQueue的常用方法及其内部实现机制。 ArrayBlockingQueue的核心是一个...

    java模拟阻塞队列

    Java中的阻塞队列实现主要依赖于`java.util.concurrent`包下的几个类,如`BlockingQueue`接口、`ArrayBlockingQueue`、`LinkedBlockingQueue`等。`BlockingQueue`接口定义了一组操作,如`put`、`take`、`offer`等,...

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

    Java源码解析阻塞队列ArrayBlockingQueue介绍是Java中的一种阻塞队列实现,使用ReentrantLock和Condition来实现同步和阻塞机制。本文将对ArrayBlockingQueue的源码进行详细分析,介绍其主要方法和实现机制。 1. ...

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

    Java源码解析阻塞队列ArrayBlockingQueue功能简介 ArrayBlockingQueue是Java中一个重要的阻塞队列实现,它基于数组实现了有界阻塞队列,提供FIFO(First-In-First-Out)功能。该队列的头元素是最长时间呆在队列中的...

    面试必备:Java线程池解析.pdf

    - ArrayBlockingQueue:基于数组的有界阻塞队列。 - LinkedBlockingQueue:基于链表的可选有界阻塞队列。 - SynchronousQueue:不存储元素的阻塞队列,提交任务必须等待另一个线程取走。 - PriorityBlockingQueue:...

    10、阻塞队列BlockingQueue实战及其原理分析

    在Java的`java.util.concurrent`包中,提供了多种实现阻塞队列的类,如`ArrayBlockingQueue`, `LinkedBlockingQueue`, `PriorityBlockingQueue`等。 阻塞队列的核心特性在于其“阻塞”行为:当队列为空时,尝试获取...

    阻塞队列(Blocking Queue)是一个支持两个附加操作的队列.txt

    1. ArrayBlockingQueue:基于数组结构的有界阻塞队列。它有一个构造参数来定义队列的容量,并使用一个锁来实现线程间的同步。 2. LinkedBlockingQueue:基于链表结构的可选界阻塞队列。默认情况下是无界的,也可以...

    Java实现简单的阻塞队列2种方式

    本文将探讨两种实现简单阻塞队列的方法:使用`wait()`和`notify()`以及使用`CountDownLatch`。 1. 使用`wait()`和`notify()`: `wait()`和`notify()`是Java中`Object`类的方法,它们是线程间通信的核心。在同步...

    Java并发编程(21)并发新特性-阻塞队列和阻塞栈(含代

    1. `ArrayBlockingQueue`: 一个基于固定大小数组的阻塞队列,公平或非公平的锁策略可选。 2. `LinkedBlockingQueue`: 基于链表结构的阻塞队列,容量可以无限大,但内部维护了一个容量参数来控制性能。 3. `...

    剖析Java中阻塞队列的实现原理及应用场景

    Java中的阻塞队列是一种特殊的线程安全的数据结构,它在多线程环境下用于高效地处理生产者-消费者问题。阻塞队列的核心特性在于当...在实际开发中,合理使用阻塞队列可以极大地提升多线程环境下的程序性能和可维护性。

    ArrayBlockingQueue源码解析-动力节点共

    ArrayBlockingQueue是Java并发编程中一个重要的数据结构,它是Java并发包`java.util.concurrent`中的一个线程安全的阻塞队列。这个队列基于数组实现,提供了在生产者和消费者之间进行数据交换的能力,同时确保了线程...

    10、阻塞队列BlockingQueue实战及其原理分析.pdf

    1. **ArrayBlockingQueue**:基于数组结构实现的有界阻塞队列,初始化时需指定容量大小。 2. **LinkedBlockingQueue**:基于链表结构实现的无界阻塞队列,也可通过构造函数指定容量大小变为有界队列。 3. **...

    ArrayBlockingQueue源码分析.docx

    `ArrayBlockingQueue` 是 Java 中实现并发编程时常用的一个线程安全的数据结构,它是一个有界的阻塞队列。在 `java.util.concurrent` 包下,`ArrayBlockingQueue` 继承自 `java.util.concurrent.BlockingQueue` 接口...

Global site tag (gtag.js) - Google Analytics