`
sunxuecheng
  • 浏览: 24969 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

简单阻塞队列实现2

阅读更多
package com.security.dpi.das.fileprocess;

import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//简单阻塞队列实现2
public class SimpleBlockingQ
{
    public SimpleBlockingQ()
    {
        // TODO Auto-generated constructor stub
    }
//  Lock 替代了 synchronized 方法和语句的使用,Condition(await(),signalAll())
//    替代了 Object (wait(), notifyAll())监视器方法的使用。
//    synchronzied   Condition
//      lock();    
//      unlock();
//      wait();         await();
//      notify();       signal();
//      notifyAll();    signalAll();
//    ReentrantLock和Synchronized
//    Synchronized是Lock的一种简化实现,一个Lock可以对应多个
//    Condition,而synchronized把Lock和Condition合并了,一个
//    synchronized Lock只对应一个Condition,可以说Synchronized是
//    Lock的简化版本。
//    在JDK 5,Synchronized要比Lock慢很多,但是在JDK 6中,它们的
//    效率差不多。
//    不要在Lock和Condition上使用wait、notiffy、notifyAll方法!
   
    private Lock lock = new ReentrantLock();
//    一个锁可以创建多个Condition
    private Condition notEmpty = lock.newCondition();
    private Condition notFull = lock.newCondition();
    private int maxLength = 10;
    private Queue<Object> q = new LinkedList<Object>();
   
    public Object take() throws InterruptedException {
        lock.lock();
        try {
            if(q.size() == 0) {
//                要执行await操作,必须先取得该Condition的锁。
//                执行await操作之后,锁会释放。
//                被唤醒之前,需要先获得锁。
                notEmpty.await();
            }
            if(q.size() != maxLength) { //判断是否满,满就叫醒其他线程来取 没有满继续移除
                notFull.signalAll();  
            }
            return q.poll();
        } finally {
            lock.unlock();
        }
    }
   
    public void ofter() throws InterruptedException {
       lock.lock();
       try {
           if(q.size() > 0) {
//               要执行signal和signalAll操作,都必须先取
//               得该对象的锁。
               notEmpty.signalAll();
           }
           if(q.size() == maxLength) {
               notFull.await();   // 如果满了就阻塞 需要其他线程来取 没满就添加
           }
           q.add(notEmpty);
       } finally {
           lock.unlock();
       }
    }
}
分享到:
评论

相关推荐

    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; ...

    java模拟阻塞队列

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

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

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

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

    下面是一个简单的阻塞队列实现例子: ```java public class BlockingQueue { private List queue = new LinkedList(); private int limit = 10; public BlockingQueue(int limit) { this.limit = limit; } ...

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

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

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

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

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

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

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

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

    元素唯一的LinkedBlockingQueue阻塞队列

    在Java并发编程中,`LinkedBlockingQueue`是一种基于链表结构的阻塞队列,它在多线程环境下的性能表现优秀,常用于实现生产者消费者模型。这个队列的一个关键特性是其内部节点的链接方式,即每个元素都是一个节点,...

    高效的实现队列

    它可能包含了上述某一种或多种队列的实现,例如用C++、Java或其他编程语言实现的简单队列、阻塞队列、并发队列等。具体的实现细节需要查看源代码才能得知。 在实际应用中,队列常被用于任务调度、消息传递、网络...

    基于Linux实现简单的队列

    2. **阻塞与非阻塞队列**: - **阻塞队列**:当队列为空时,尝试出队的操作会阻塞,直到有新的元素入队;同样,当队列已满时,尝试入队的操作也会阻塞,直到有其他线程执行出队操作释放了空间。这种方式有助于同步...

    快速非阻塞并发队列算法

    在对12节点SGI Challenge多处理器的实验中显示,新的非阻塞队列算法在性能上始终超越已知的最佳替代方案,特别是在提供通用原子原语(如比较并交换或条件加载存储)的机器上,它是首选算法。另一方面,两锁并发队列...

    利用消息队列实现进程间通信

    需要指定消息队列标识符、消息结构体指针、消息的长度以及控制标志,如是否阻塞等。 在描述中提到的`msgsend`函数,可能是一个自定义的函数,用来封装`msgsnd()`函数的调用。当用户输入'end'时,程序会结束,这可能...

    使用队列实现排队系统

    - **阻塞队列**:在多线程环境中,当队列为空时,出队操作会阻塞,直到有新的元素入队;反之,当队列满时,入队操作也会阻塞。 ### 6. 编程实现 在Python中,可以使用内置的`collections.deque`实现队列,或者使用...

    高效延时队列的设计与实现

    2. 使用JDK自带的DelayQueue:这是一个无界阻塞队列,元素需实现Delayed接口,当延迟时间到达时,元素可以从队列中取出。但这种方式不适用于分布式环境。 3. 消息中间件实现,如RabbitMQ:通过设置消息的存活时间...

    Java wait和notifyAll实现简单的阻塞队列

    Java wait和notifyAll实现简单的阻塞队列 在 Java 中,wait 和 notifyAll 是两个非常重要的方法,它们都是在 Object 类中声明的,用于实现线程之间的通信和同步。wait 方法会使调用线程进入等待状态,并释放所持有...

    数据结构——队列的实现

    1. 简单队列:最基本的队列实现,只有入队和出队两种操作。 2. 循环队列:当队列满时,队尾指针回绕到队列的开头,形成循环,有效解决了满队问题。 3. 链式队列:使用链表作为底层数据结构,灵活且易于扩展。 4. ...

    C#使用队列(Queue)解决简单的并发问题

    这个简单的例子展示了如何利用队列实现生产者-消费者模型。生产者(在此案例中是用户提交文章发布请求)将任务添加到队列,而消费者(后台线程)则负责从队列中取出并处理这些任务。由于队列的线程安全特性,多个...

    C语言实现多级反馈队列调度算法

    // 如果已经是最高的优先级队列,进程被阻塞 block_process(current_process); } } else { // 执行进程 execute_process(current_process); } break; // 跳出循环,处理完一个进程就结束 } } } ``` 在...

    Java并发编程之阻塞队列详解

    Java的`java.util.concurrent`包提供了多种阻塞队列实现: 1. **ArrayBlockingQueue**:这是一个基于固定大小数组实现的阻塞队列。在创建时必须指定容量,且可选择是否采用公平的访问策略。公平策略意味着等待时间...

Global site tag (gtag.js) - Google Analytics