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

简单阻塞队列实现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种方式

    Java实现简单的阻塞队列2种方式,1使用wait(),notify();2使用countdownlatch实现

    基于Linux实现简单的队列

    基于Linux实现简单的队列功能。本代码实现了阻塞和非阻塞方式出入队列。同时是线程安全的。如果队列满,在入队时可以指定最大超时。如果队列空,可以在出队时指定最大超时。

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

    主要介绍了Java wait和notifyAll实现简单的阻塞队列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Redis实现分布式队列浅析

    Redis是什么? Redis是一个简单的,高效的,分布式的,基于内存的缓存工具。...需要实现分布式队列,至少要有一个master(192.168.45.1)和一个slave(192.168.45.130) linux下默认配置文件在/etc/redis/

    Redis 实现队列原理的实例详解

    Redis 实现队列原理的实例详解 场景说明: ·用于处理比较耗时的请求,例如批量发送邮件,如果直接在网页触发执行发送,程序会出现超时 ·高并发场景,当某个时刻请求瞬间增加时,可以把请求写入到队列,后台在去...

    blockingQueues:简单,高性能,goroutine安全队列,可用作资源池或作业队列

    阻塞队列提供了一些简单,高性能,常规的安全队列,可用作资源池或作业队列。 主要重点是在不牺牲可读性的前提下实现简单性和高性能。 实际上,我试图提供有关代码的良好文档以及一些用法示例。 提供的队列 ...

    python队列Queue的详解

    Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 基本FIFO队列 class Queue.Queue(maxsize=0) FIFO即First ...

    基于GD32F1x0手动编程实现简易FreeRtos之任务阻塞

    在之功能基础上扩展实现了任务阻塞延时功能。

    操作系统作业(进程控制管理实现)

    2、 定义进程状态转换方式:进程的状态转换是由进程内部操作或操作系统的控制引起,由于无法实现这些功能,学生可以采用随机数方法或键盘控制方法模拟,并实现对应的控制程序。随机方法指产生1-6的随机数,分别代表...

    java语言操作系统课程设计模拟进程管理系统源码.zip

    针对需求1、2: 为实现多个进程并发运行需要建立管理对象和进程对象的联系以便对运行的进程进行管理,故可以在管理对象中设置就绪、阻塞、运行队列来容纳进程,从而方便的进行管理; ①创建:初始化刚建立的进程对象...

    基础知识五、Python实现线程池之线程安全队列

    文章目录一、线程池组成二、线程安全队列的实现三、测试逻辑3.1、测试阻塞逻辑3.2、测试读写加锁逻辑 一、线程池组成  一个完整的线程池由下面几部分组成,线程安全队列、任务对象、线程处理对象、线程池对象。其中...

    利用简单的结构和控制方法模拟进程结构、进程状态转换和进程控制

    2、 定义进程状态转换方式:进程的状态转换是由进程内部操作或操作系统的控制引起,由于无法实现这些功能,学生可以采用随机数方法或键盘控制方法模拟,并实现对应的控制程序。随机方法指产生1-6的随机数,分别代表...

    c++实现进程调度的模拟

    利用c++模拟进程的调度。...(4 分)  按先进先出方式管理就绪和阻塞队列,按队列输出进程状态 (2 分)  完成可变分区的分配与回收 (3 分)  界面清晰友好 (2 分)  实验结束后撰写实验报告(5 分)。

    操作系统实验 模拟 作业调度 模拟进程控制

    2、 定义进程状态转换方式:进程的状态转换是由进程内部操作或操作系统的控制引起,由于无法实现这些功能,学生可以采用随机数方法或键盘控制方法模拟,并实现对应的控制程序。随机方法指产生1-6的随机数,分别代表...

    论文研究-无线移动网中的队列降质接纳控制.pdf

    提出了在无线移动网中基于队列的降质接纳控制算法,它区分了实时业务和非实时业务,同时考虑了切换优先和业务优先两...性能分析结果显示该算法简单易实现,具有较低的新呼叫阻塞率、切换呼叫中断率和较高的系统利用率。

    Python实现简单多线程任务队列

    最近我在用梯度下降算法绘制神经网络的数据时,遇到了一些算法性能的问题。... 我不想用一个像 cerely(一种分布式任务队列)一样大而全的任务队列框架,因为框架对于我的这点需求来说太重了,并且我的绘图也并不

    Python 使用threading+Queue实现线程池示例

    一、线程池 1、为什么需要使用线程池 1.1 创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率。 记创建线程消耗时间T1,执行任务消耗时间T2,销毁线程消耗时间T3,如果T1+T3&gt;T2,...2、

    黑龙江大学《操作系统》实验报告及源码C/C++编写

    有实验源码和实验报告,附有实验算法流程图。实验一:进程控制、实验二:分页式存储管理...按先进先出的方式管理就绪和阻塞队列,按队列输出进程状态4.完成可变分区的分配和回收5.界面清晰友好6.实验结束后撰写实验报告

    操作系统进程控制C++代码实现

    利用简单的结构和控制方法模拟进程结构、进程状态和进程控制。 内容: 1.能够模拟进程的创建与...3.按先进先出方式管理就绪和阻塞队列,能够按队列形式输出进程状态 4.完成可变分区的分配与回收,分配用最佳适应方式;

    node-persistent-queue:使用setImmediate()在Node.js中长时间运行顺序任务的简单SQLite支持的队列

    简单SQLite支持的队列,可使用setImmediate()在Node.js中运行许多短任务 如果您有大量正在运行的小型任务,则该库将允许它们通过node.js的主事件线程按顺序执行,而不会阻塞/使其他node.js事件处于饥饿状态。 描述 ...

Global site tag (gtag.js) - Google Analytics