`
lucky_xingxing
  • 浏览: 117963 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java多线程消费者生产者模式(BlockingQueue 通过阻塞队列实现)

    博客分类:
  • java
阅读更多

import java.util.concurrent.BlockingQueue;

import java.util.concurrent.LinkedBlockingQueue;

 

/**

 * Created with IntelliJ IDEA.

 * User: csx

 * Date: 4/24/14

 * Time: 9:56 AM

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

 *

 * 生产者与消费者模型中,要保证以下几点:

 * 1 同一时间内只能有一个生产者生产

 * 2 同一时间内只能有一个消费者消费

 * 3 生产者生产的同时消费者不能消费

 * 4 消费者消费的同时生产者不能生产

 * 5 共享空间空时消费者不能继续消费

 * 6 共享空间满时生产者不能继续生产

 *

 * 使用并发库中的BlockingQueue(阻塞队列) 实现生产者与消费者

 */

public class WaitNoticeDemo {

    public static void main(String[] args) {

        //固定容器大小为10

        BlockingQueue<Food> foods = new LinkedBlockingQueue<Food>(10);

        Thread produce = new Thread(new Produce(foods));

        Thread consume = new Thread(new Consume(foods));

        produce.start();

        consume.start();

    }

}

 

/**

 * 生产者

 */

class Produce implements Runnable{

    private BlockingQueue<Food> foods;

    Produce(BlockingQueue<Food> foods) {

        this.foods = foods;

    }

 

    @Override

    public void run() {

        int i = 0;

        while (true){

            try {

                //当生产的食品数量装满了容器,那么在while里面该食品容器(阻塞队列)会自动阻塞  wait状态 等待消费

                foods.put(new Food("食品"+i));

                i++;

            } catch (InterruptedException e) {

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

            }

        }

    }

}

 

/**

 * 消费者

 */

class Consume implements Runnable {

    private BlockingQueue<Food> foods;

    Consume(BlockingQueue<Food> foods){

        this.foods = foods;

    }

    @Override

    public void run() {

        try {

            Thread.sleep(1000);  //用于测试当生产者生产满10个食品后是否进入等待状态

            while (true){

                //当容器里面的食品数量为空时,那么在while里面该食品容器(阻塞队列)会自动阻塞  wait状态 等待生产

                Food food = foods.take();

                System.out.println("消费"+food.getName());

            }

        } catch (InterruptedException e) {

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

        }

    }

}

 

/**

 * 食品

 */

class Food{

    private String name;

 

    String getName() {

        return name;

    }

 

    Food(String name){

        this.name = name;

        System.out.println("生产"+name);

    }

}

 

如有不足 还请大家留言纠正修改。

0
0
分享到:
评论

相关推荐

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

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

    个人总结的深入java多线程开发

    看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...

    Java NIO+多线程实现聊天室

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

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

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

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

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

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

    javaSE代码实例

    16.4.5 “生产者-消费者”案例的实际运行 365 16.4.6 notify方法的使用 366 16.4.7 同步的语句块 367 16.4.8 线程的死锁 369 16.4.9 防止错误的使用wait、notify、notifyAll方法 371 16.5 获取当前正在...

Global site tag (gtag.js) - Google Analytics