`
jack.zhao829
  • 浏览: 24683 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

阻塞队列的实现

    博客分类:
  • java
阅读更多

package com.aliyun.blockqueue;

 

import java.util.LinkedList;

import java.util.List;

 

/**

 * 阻塞队列实现

 * Created with IntelliJ IDEA.

 * User: jack

 * Date: 14-6-16

 * Time: 下午3:38

 * To change this template use File | Settings | File Templates.

 */

public class SimpleBlockingQueue {

    private List blockQueue=new LinkedList(); //存放实例的队列

    private int limit=10;  //队列的上限

 

    public SimpleBlockingQueue(int limit){

        this.limit=limit;

    }

 

    /**

     * 向队列中添加数据

     * @param object

     */

    public synchronized void put(Object object){

        //判断队列是否已满

        while(this.limit==blockQueue.size()){

            try {

                wait();

                System.out.println("进入阻塞"+object);

            } catch (InterruptedException e) {

                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.

            }

        }

        //判断队列是否还没有数据,如果没有唤醒所有线程

        if(blockQueue.size()==0){

              notifyAll();

            System.out.println("没有数据,唤醒所有线程");

        }

        //向队列中添加元素

        this.blockQueue.add(object);

        for(Object obj:this.blockQueue){

            System.out.println("元素"+obj+"已添加到队列中");

        }

 

    }

 

    /**

     * 获取队列中的数据

     */

    public synchronized Object take(){

         //判断队列是否有数据

        while(this.blockQueue.size()==0){

            try {

                wait();

                System.out.println("获取数据时进入阻塞状态");

            } catch (InterruptedException e) {

                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.

            }

        }

        //判断队列是否已满

        if(this.limit==this.blockQueue.size()){

                notifyAll();

            System.out.println("获取数据时队列已满");

        }

        System.out.println(this.blockQueue.remove(0));

        return this.blockQueue.remove(0);

 

    }

}

 

package com.aliyun.blockqueue;

 

import org.junit.Test;

 

/**

 * 测试阻塞队列的实现

 * Created with IntelliJ IDEA.

 * User: jack

 * Date: 14-6-16

 * Time: 下午3:59

 * To change this template use File | Settings | File Templates.

 */

public class TestSimpleBlockingQueue {

 

    @Test

    public void testPut(){

        SimpleBlockingQueue simpleBlockingQueue=new SimpleBlockingQueue(5);

        for(int i=0;i<10;i++){

            simpleBlockingQueue.put("测试数据");

            if(i==7){

                simpleBlockingQueue.take();

            }

        }

 

    }

}

分享到:
评论

相关推荐

    java线程聊天室(阻塞队列实现)

    【Java线程聊天室(阻塞队列实现)】 在Java编程中,多线程是构建并发应用程序的关键技术。在创建一个线程聊天室时,我们通常会涉及到多个线程之间的交互,例如用户发送消息、接收消息以及处理网络通信等。而阻塞...

    java阻塞队列实现原理及实例解析.docx

    在提供的代码实例中,我们看到了一个简单的阻塞队列实现,使用了`LinkedList`作为底层数据结构,并通过`synchronized`关键字来实现线程安全。`enqueue`方法用于向队列尾部添加元素,`dequeue`方法用于从队列头部移除...

    阻塞队列实现生产者消费者模式Java开发Java经验技巧共

    在"阻塞队列实现生产者消费者模式Java开发Java经验技巧共4页.pdf.zip"这个压缩包中,很可能是详细介绍了如何使用Java的阻塞队列来构建生产者消费者模式,可能包括以下知识点: 1. **阻塞队列接口**:首先,会介绍`...

    消息分发框架(基于JAVA阻塞队列实现、 生产者消费者模型)

    Java中的`java.util.concurrent`包提供了多种阻塞队列实现,如`ArrayBlockingQueue`, `LinkedBlockingQueue`, `PriorityBlockingQueue`等。 ### 生产者消费者模型 生产者消费者模型是并发设计模式的一种,用于协调...

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

    在Java中,`java.util.concurrent`包提供了多种阻塞队列实现,如`ArrayBlockingQueue`, `LinkedBlockingQueue`等。它们都实现了`BlockingQueue`接口,提供了一套线程安全的方法来添加和移除元素,如`put()`, `take()...

    基于小根堆实现定时器,利用单例模式与阻塞队列实现异步的日志系统

    基于c++11的轻量级Web并发服务器,使用Epoll与Reactor高并发模型,基于小根堆实现了定时器,利用单例模式与阻塞队列实现异步的日志系统.zip优质项目,资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松...

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

    ArrayBlockingQueue是一个基于固定数组实现的阻塞队列。它的容量在创建时就需要指定,并且不可变。队列内部采用双指针机制,一个指向头部,一个指向尾部,进行元素的入队和出队操作。ArrayBlockingQueue支持公平和非...

    java阻塞队列实现原理及实例解析

    Java阻塞队列实现原理及实例解析 Java阻塞队列是一种特殊的队列,它能够在队列为空或满时阻塞线程,使得线程之间能够更好地协作和通信。阻塞队列的实现原理是基于锁机制和条件变量机制的,通过wait和notify方法来...

    java模拟阻塞队列

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

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

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

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

    以下是一个基于`wait()`和`notify()`的简单阻塞队列实现: ```java public class SimpleBlockQueue&lt;T&gt; { private int capacity; private LinkedList&lt;T&gt; queue = new LinkedList(); private int count; ...

    并发-线程池和阻塞队列

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

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

    ### 10、阻塞队列BlockingQueue 实战及其原理分析 #### 一、阻塞队列概述 阻塞队列(BlockingQueue)是Java语言中...通过对不同阻塞队列实现的理解和掌握,可以更好地设计和优化高并发系统,提升系统的稳定性和性能。

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

    Java中常见的阻塞队列实现包括: 1. `ArrayBlockingQueue`: 一个基于固定大小数组的阻塞队列,公平或非公平的锁策略可选。 2. `LinkedBlockingQueue`: 基于链表结构的阻塞队列,容量可以无限大,但内部维护了一个...

    高性能阻塞队列的数据结构创新.pptx

    ### 高性能阻塞队列的数据结构创新 #### 一、阻塞队列的概念与应用 **阻塞队列**是一种特殊的队列,它具备线程安全的特点,...在实际应用中,可以根据具体场景选择合适的阻塞队列实现方式,以达到最佳的并发效果。

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

    Java 1.5引入的`java.util.concurrent`包提供了一些内置的阻塞队列实现,主要包括: 1. **ArrayBlockingQueue**:基于固定大小的数组实现,插入和删除操作都具有O(1)的时间复杂度。队列的公平性可以在构造时选择,...

    java学习(基于Java阻塞队列的搜索实例).pdf

    本实例中使用了`ArrayBlockingQueue`,这是最常用的阻塞队列实现之一,它是一个有界队列,能够按FIFO(先进先出)的顺序处理元素。创建`ArrayBlockingQueue`时,需要指定队列的容量,这有助于防止内存溢出,因为队列...

    并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法

    `LinkedBlockingQueue` 同样是 `java.util.concurrent` 包下的一个线程安全的阻塞队列实现,它继承自 `AbstractQueue` 并实现了 `BlockingQueue` 接口。`LinkedBlockingQueue` 的特点是可以在队列满时阻塞生产者线程...

    c++11 实现的阻塞队列

    C++11 实现的阻塞队列 C++11 中的阻塞队列是指在多线程环境下,实现生产者消费者模式的队列。阻塞队列的实现需要解决两个问题:线程安全和阻塞机制。在 C++11 中,我们可以使用 std::mutex、std::condition_...

Global site tag (gtag.js) - Google Analytics