美文网首页
生产者与消费者

生产者与消费者

作者: 请收下章鱼君的膝盖 | 来源:发表于2018-12-02 17:51 被阅读13次

使用BlockingQueue模拟生产者与消费者

class Producer extends Thread{
  private BlockingQueue queue;
  private volatile boolean flag=true;
  private static AtomicInteger count=new AtomicInteger();

  public Producer(BlockingQueue queue){
    this.queue=queue;
  }
  @Override
  public void run() {
    System.out.println(getName()+"生产者线程启动...");
    try {
        while (flag){
            System.out.println(getName()+"生产者开始生产消息...");
            //如果flag为true,queue就入队列。(原子类进行计数)
            Integer i = count.incrementAndGet();
            boolean offer = queue.offer(i);
            if(offer){
                System.out.println(getName()+"生产者生产生产消息:"+i+"成功");
            }else {
                System.out.println(getName()+"生产者生产生产消息:"+i+"失败");
            }
            Thread.sleep(1000);
        }
    }catch (Exception e){

    }finally {
        System.out.println(getName()+"生产者线程停止...");
    }
  }

  public void stopThread(){
    this.flag=false;
  }
}


class Consumer extends Thread{
  private BlockingQueue queue;
  private volatile boolean flag=true;

  public Consumer(BlockingQueue queue){
    this.queue=queue;
  }
  @Override
  public void run() {
    System.out.println(getName()+"消费者线程启动...");
    try {
        while (flag){
            System.out.println(getName()+"消费者开始消费消息...");
            //如果flag为true,queue就出队列
            Integer poll = (Integer) queue.poll(2, TimeUnit.SECONDS);
            if(poll != null){
                System.out.println(getName()+"消费者获取消息:"+poll+"成功");
            }else {
                System.out.println(getName()+"消费者获取消息:"+poll+"失败");
                this.flag=false;
            }

        }
    }catch (Exception e){

    }finally {
        System.out.println(getName()+"消费者线程停止...");
    }
  }
}

public class ProduceConsumerThread {
  public static void main(String[] args) throws InterruptedException {
    BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(10);
    Producer p1 =new Producer(queue);
    Producer p2 =new Producer(queue);
    Consumer c1 =new Consumer(queue);

    p1.start();
    p2.start();
    c1.start();

    Thread.sleep(3*1000);
    p1.stopThread();
    p2.stopThread();
  }
}

相关文章

  • kafka理解

    kafka生产者、消费者与分区的分配关系 生产者如何传输到分区消费者如何从分区读取生产者、消费者与分区的关系 主题...

  • Java 并发编程——生产者与消费者

    1. 生产者与消费者 1.1 程序基本实现(问题引出) 生产者与消费者是线程操作的经典案例,即:生产者不断生产,消...

  • java多线程

    生产者与消费者问题

  • Node下的RabbitMQ应用

    一个最简单的生产者与消费者建立过程 创建生产者 创建消费者

  • 操作系统知识点持续更新

    生产者消费者问题 关于生产者消费者问题可以参考这篇文章:生产者消费者问题的java实现 临界区与互斥量 临界区:保...

  • 生产者与消费者模型

    生产者与消费者模型 通过使用Object的wait(),notify()方法进行生产者与消费者模型中出现的数据同步...

  • 2-1.死锁-经典同步问题

    三、经典同步问题 1.生产者-消费者问题 计算机系统中的许多问题都可归结为生产者与消费者问题,生产者与消费者可以通...

  • 生产者与消费者模式

    一、模式特点 生产者与消费者模式中,生产者和消费者各自做着自己的工作,生产者生产物品,将物品放入缓冲区。消费者从缓...

  • 生产者-消费者 模型

    生产者与消费者基本程序模型 在多线程开发过程之中最为著名的案例就是生产者与消费者操作,该操作的主要流程如下:生产者...

  • 生产者与消费者

    使用BlockingQueue模拟生产者与消费者

网友评论

      本文标题:生产者与消费者

      本文链接:https://www.haomeiwen.com/subject/kntscqtx.html