`

生产者消费者 BlockingQueue 实现

阅读更多

BlockingQueue是一个线程安全的队列,本身的部分方法实现了线程之间的调度,实现生产者消费者非常方便,比synchronized,wait更容易控制,不过看BlockingQueue的实现类ArrayBlockingQueue的源码,主要还是使用Lock和条件变量Condition来实现,足以见的Lock的灵活和强大,下面是我写的实现:

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

/**
 * Created by Administrator on 14-4-8.
 */
public class BlockingQueueDemo {

    public static void main (String[] args) {
        BlockingQueue blockingQueue = new ArrayBlockingQueue(GodOwn.MAX_SIZE);
        GodOwn godOwn = new GodOwn(blockingQueue);
        for (int i = 0; i < 10; i++) {
            new Producer(godOwn).start();
        }

        for (int i = 0; i < 10; i++) {
            new Reducer(godOwn).start();
        }
    }

}

class GodOwn {

    /**
     * 仓库能盛放馒头最大数量
     */
    public static final int MAX_SIZE = 3;

    private BlockingQueue<Mantou> blockingQueue;

    GodOwn (BlockingQueue<Mantou> blockingQueue) {
        this.blockingQueue = blockingQueue;
    }

    public void produce () throws InterruptedException {
        Mantou mantou = new Mantou();
        blockingQueue.put(mantou);
        System.out.println("生产了一个,仓库还有" + blockingQueue.size());
    }

    public void reduce () throws InterruptedException {
        blockingQueue.take();
        System.out.println("消费了一个,仓库还有" + blockingQueue.size());
    }

}

/**
 * 消费者
 */
class Producer extends Thread {
    private GodOwn godOwn;

    Producer (GodOwn godOwn) {
        this.godOwn = godOwn;
    }

    public void run () {
        try {
            godOwn.produce();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

/**
 * 消费者
 */
class Reducer extends Thread {
    private GodOwn godOwn;

    Reducer (GodOwn godOwn) {
        this.godOwn = godOwn;
    }

    public void run () {
        try {
            godOwn.reduce();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

/**
 * 馒头
 */
class Mantou {
}

 

分享到:
评论

相关推荐

    java并发学习之BlockingQueue实现生产者消费者详解

    主要介绍了java并发学习之BlockingQueue实现生产者消费者详解,具有一定参考价值,需要的朋友可以了解下。

    java 多线程 生产者消费者模式源码

    java 多线程 生产者消费者模式,多个生产者对多个消费者,使用jdk 线程池及 BlockingQueue实现,解决了待生产的任务生产完成后,正常终止所有线程,避免线程(特别是消费者线程)因阻塞而无限等待的情况。源码中还简单...

    【Java】Queue、BlockingQueue和队列实现生产者消费者模式

    源码:BlockingQueue实现生产者消费者模式→ 输出结果截图 1. Queue接口 – 队列 public interface Queue extends Collection Collection的子接口,表示队列FIFO(First In First Out) 常用方法: (1)抛出异常...

    Java多线程 BlockingQueue实现生产者消费者模型详解

    主要介绍了Java多线程 BlockingQueue实现生产者消费者模型详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java多线程Queue、BlockingQueue和使用BlockingQueue实现生产消费者模型方法解析

    主要介绍了Java多线程Queue、BlockingQueue和使用BlockingQueue实现生产消费者模型方法解析,涉及queue,BlockingQueue等有关内容,具有一定参考价值,需要的朋友可以参考。

    Disruptor 极速体验.docx

    我们知道 BlockingQueue 是一个 FIFO 队列,生产者(Producer)往队列里发布(publish)一项事件(或称之为“消息”也可以)时,消费者(Consumer)能获得通知;如果没有事件时,消费者被堵塞,直到生产者发布了新的事件。 ...

    Disruptor 入门 - v1.0

    我们知道 BlockingQueue 是一个 FIFO 队列,生产者(Producer)往队列里发布(publish)一项事件(或称之为“消息”也可以)时,消费者(Consumer)能获得通知;如果没有事件时,消费者被堵塞,直到生产者发布了新的事件。 ...

    ProducerConsument:Java procucer - 消耗性问题。 使用 BlockingQueue 实现

    生产者消费者在 Java 中实现生产者 - 消费者问题。 基于此处介绍的示例: :

    Java NIO+多线程实现聊天室

    阻塞队列BlockingQueue,生产者消费者模式 选择器 渠道 字节缓冲区 ProtoStuff 高性能序列化 HttpClient连接池 Spring依赖注入 lombok简化POJO开发 原子指标 内置锁 竣工服务 log4j+slf4j日志 实现的功能 登录注销 ...

    高级开发并发面试题和答案.pdf

    面试高级开发的期间整理的面试题目,记录我面试遇到过的并发题目以及答案 目录 并发 常说的并发问题是哪些;资源竞争、死锁、事务、可见性 ...实现一个阻塞队列(用Condition写生产者与消费者就)?BlockingQueue

    Java开发基于多线程和NIO实现聊天室源码+项目说明(含服务端+客户端).zip

    - 阻塞队列BlockingQueue,生产者消费者模式 - Selector - Channel - ByteBuffer - ProtoStuff 高性能序列化 - HttpClient连接池 - Spring依赖注入 - lombok简化POJO开发 - 原子变量 - 内置锁 - ...

    customcode:至

    BlockingQueue-生产者消费者 具有一些集合类的自定义实现 有以下示例代码 易挥发的 僵局 java.util.concurrent.Phaser构造 执行者 使用单独的线程打印奇数,偶数数字 从三个不同的线程打印数字 安全管理器 ForkJoin...

    【2018最新最详细】并发多线程教程

    【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized ...27.一篇文章,让你彻底弄懂生产者--消费者问题

    Chat:Java NIO+多线程实现聊天室

    Java基于多线程和NIO实现聊天室涉及到的技术点线程池ThreadPoolExecutor阻塞队列BlockingQueue,生产者消费者模式SelectorChannelByteBufferProtoStuff 高性能序列化HttpClient连接池Spring依赖注入lombok简化POJO...

    DC_Tower_Elevator:直流塔式电梯挑战赛

    假设问题是生产者/消费者目标,则使用BlockingQueue来完成此任务。 之所以选择BlockingQueue,是因为数据类型必须是线程安全的,并且必须实现所需的方法。要求处理每个电梯都会分配一个或多个请求。 它检查队列中...

    blocking-queue:COEN 283 的阻塞队列项目

    阻塞队列 COEN 283 的阻塞队列项目 通过阻塞队列传递消息 使用同步的消息缓冲区使用队列来实现阻塞队列,并在队列为空/满时进行自旋等待。 无锁消息缓冲区创建环形缓冲区;...线程观察者监控线程生产者和消费者的效率

    Scaling-Threadpool-Server

    基本生产者/消费者示范 编写用于在与客户端不同的线程中执行随机生成的消息,但不再使用 运作 班级 描述 包含一个静态方法,该方法使用SHA1计算消息哈希码 水池 班级 描述 利用资源包中的BlockingQueue的线程的...

    Java并发编程实战

    5.3 阻塞队列和生产者-消费者模式 5.3.1 示例:桌面搜索 5.3.2 串行线程封闭 5.3.3 双端队列与工作密取 5.4 阻塞方法与中断方法 5.5 同步工具类 5.5.1 闭锁 5.5.2 FutureTask 5.5.3 信号量 5.5.4 栅栏 5.6...

    Java 并发编程实战

    5.3 阻塞队列和生产者-消费者模式 5.3.1 示例:桌面搜索 5.3.2 串行线程封闭 5.3.3 双端队列与工作密取 5.4 阻塞方法与中断方法 5.5 同步工具类 5.5.1 闭锁 5.5.2 FutureTask 5.5.3 信号量 5.5.4 栅栏 5.6...

    Java并发编程(学习笔记).xmind

    生产者-消费者模式 中断的处理策略 传递InterruptedException 恢复中断,让更高层的代码处理 PriorityQueue(非并发) ConcurrentSkipListMap 替代同步的SortedMap ...

Global site tag (gtag.js) - Google Analytics