java解决单缓冲生产者消费者问题示例

经典的生产者消费者问题模拟。此程序模拟最简单情形——单缓冲。为模拟实际情况,consume item和produce item时加了延时,可以通过修改延时模拟不同的生成消费速率。

[code]

[/co/**
 * single buffer consumer-producer problem.
 * by xu(xusiwei1236@163.com).
 * */
public class ConsumerProducer {

static Object buffer = null;

static Object mutex = new Object();

static Object condConsumer = new Object();

static Object condProducer = new Object();

public static void main(String[] args) {
  Thread producer = new Thread() {
   public void run() {
//    for(int i=0; i<10; i++) {
    for(int i=0; ; i++) {
     // produce item.
     try {
      Thread.sleep(1000);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
     String item = new String("item-" + i);
     System.out.println("[producer] produced " + item);

// wait for buffer empty.
     synchronized (condProducer) {
      while(buffer != null) {
       try {
        condProducer.wait();
       } catch (InterruptedException e) {
        e.printStackTrace();
       }
      }
     }

// put item to buffer.     
     synchronized (mutex) {
      buffer = item;
      System.out.println("[producer] put " + item + " to buffer.");
     }

// notify consumers.
     synchronized (condConsumer) {
      condConsumer.notify();
     }
    }
   }
  };

Thread consumer = new Thread() {
   public void run() {
//    for(int i=0; i<10; i++) {
    for( ; ; ) {
     // wait for item come.
     synchronized (condConsumer) {
      while( buffer == null ) {
       try {
        condConsumer.wait();
       } catch (InterruptedException e) {
        e.printStackTrace();
       }
      }
     }

// get item from buffer.
     String item = null;
     synchronized (mutex) {
      item = (String)buffer;
      buffer = null;
      System.out.println("  [consumer] get " + item + " from buffer.");
     }

// consume item.
     try {
      Thread.sleep(500);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
     System.out.println("  [consumer] comsumed " + item);

// notify producers.
     synchronized (condProducer) {
      condProducer.notify();
     }
    }
   }
  };

consumer.start();
  producer.start();
 }
}de]

(0)

相关推荐

  • java多线程解决生产者消费者问题

    本文实例讲述了java多线程解决生产者消费者问题的方法.分享给大家供大家参考.具体分析如下: 题目是这样的: 采用Java 多线程技术,设计实现一个符合生产者和消费者问题的程序.对一个对象(枪膛)进行操作,其最大容量是12颗子弹.生产者线程是一个压入线程,它不断向枪膛中压入子弹:消费者线程是一个射出线程,它不断从枪膛中射出子弹. 要求: (1)给出分析过程说明. (2)程序输出,要模拟体现对枪膛的压入和射出操作: (2)设计程序时应考虑到两个线程的同步问题. 这个和著名的生产者消费者问题几乎是一

  • JAVA生产者消费者(线程同步)代码学习示例

    一.问题描述 生产者消费者问题是一个典型的线程同步问题.生产者生产商品放到容器中,容器有一定的容量(只能顺序放,先放后拿),消费者消费商品,当容器满了后,生产者等待,当容器为空时,消费者等待.当生产者将商品放入容器后,通知消费者:当消费者拿走商品后,通知生产者. 二.解决方案 对容器资源加锁,当取得锁后,才能对互斥资源进行操作. 复制代码 代码如下: public class ProducerConsumerTest { public static void main(String []args

  • Java生产者和消费者例子_动力节点Java学院整理

    生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的缓冲区.其中一个是生产者,用于将消息放入缓冲区:另外一个是消费者,用于从缓冲区中取出消息.问题出现在当缓冲区已经满了,而此时生产者还想向其中放入一个新的数据项的情形,其解决方法是让生产者此时进行休眠,等待消费者从缓冲区中取走了一个或者多个数据后再去唤醒它.同样地,当缓冲区已经空了,而消费者还想去取消息,此时也可以让消费者进行休眠,等待生产者放入一个或者多

  • Java并发编程中的生产者与消费者模型简述

    概述 对于多线程程序来说,生产者和消费者模型是非常经典的模型.更加准确的说,应该叫"生产者-消费者-仓库模型".离开了仓库,生产者.消费者就缺少了共用的存储空间,也就不存在并非协作的问题了. 示例 定义一个场景.一个仓库只允许存放10件商品,生产者每次可以向其中放入一个商品,消费者可以每次从其中取出一个商品.同时,需要注意以下4点: 1.  同一时间内只能有一个生产者生产,生产方法需要加锁synchronized. 2.  同一时间内只能有一个消费者消费,消费方法需要加锁synchro

  • 浅谈java线程中生产者与消费者的问题

    一.概念 生产者与消费者问题是一个金典的多线程协作的问题.生产者负责生产产品,并将产品存放到仓库:消费者从仓库中获取产品并消费.当仓库满时,生产者必须停止生产,直到仓库有位置存放产品:当仓库空时,消费者必须停止消费,直到仓库中有产品. 解决生产者/消费者问题主要用到如下几个技术:1.用线程模拟生产者,在run方法中不断地往仓库中存放产品.2.用线程模拟消费者,在run方法中不断地从仓库中获取产品.3  . 仓库类保存产品,当产品数量为0时,调用wait方法,使得当前消费者线程进入等待状态,当有新

  • Java 生产者/消费者问题实例详解

    生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品.互相等待,从而发生死锁. 以下实例演示了如何通过线程解决生产者/消费者问题: /* author by w3cschool.cc ProducerConsumerTest.java */ public

  • java解决单缓冲生产者消费者问题示例

    经典的生产者消费者问题模拟.此程序模拟最简单情形--单缓冲.为模拟实际情况,consume item和produce item时加了延时,可以通过修改延时模拟不同的生成消费速率. [code] [/co/** * single buffer consumer-producer problem. * by xu(xusiwei1236@163.com). * */public class ConsumerProducer { static Object buffer = null; static

  • Java基于Lock的生产者消费者模型示例

    本文实例讲述了Java基于Lock的生产者消费者模型.分享给大家供大家参考,具体如下: 前面一篇<Java锁机制Lock用法>简单介绍了锁机制,这里进一步分析一下基于lock的生产者消费者模型. package com.expgiga.JUC; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Reentra

  • java wait()/notify() 实现生产者消费者模式详解

    java wait()/notify() 实现生产者消费者模式 java中的多线程会涉及到线程间通信,常见的线程通信方式,例如共享变量.管道流等,这里我们要实现生产者消费者模式,也需要涉及到线程通信,不过这里我们用到了java中的wait().notify()方法: wait():进入临界区的线程在运行到一部分后,发现进行后面的任务所需的资源还没有准备充分,所以调用wait()方法,让线程阻塞,等待资源,同时释放临界区的锁,此时线程的状态也从RUNNABLE状态变为WAITING状态: noti

  • Golang rabbitMQ生产者消费者实现示例

    目录 消费者 生产者 消费者 package main import ( "fmt" "github.com/streadway/amqp" ) func failOnError(err error, msg string) { if err != nil { fmt.Println("%s: %s", msg, err) } } // 只能在安装 rabbitmq 的服务器上操作 func main() { conn, err := amqp.

  • Lock、Condition实现简单的生产者消费者模式示例

    复制代码 代码如下: package condition; import java.util.ArrayList;import java.util.List;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock; /** * 利用Lock.Condition实现生产者消费者模式 * @aut

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

    BlockingQueue BlockingQueue.解决了多线程中,如何高效安全"传输"数据的问题.程序员无需关心什么时候阻塞线程,什么时候唤醒线程,该唤醒哪个线程. 方法介绍 BlockingQueue是Queue的子类 void put(E e) 插入指定元素,当BlockingQueue为满,则线程阻塞,进入Waiting状态,直到BlockingQueue有空闲空间再继续. 这里以ArrayBlockingQueue为例进行分析 void take() 队首出队,当Bloc

  • ruby线程实现生产者消费者问题示例(队列Queue实现线程同步)

    Ruby线程实现经典的生产者消费者问题,用ruby中的Queue类实现线程同步问题. 复制代码 代码如下: require "thread"  puts "ProAndCon" queue = Queue.new    #用队列Queue实现线程同步 producer = Thread.new do      10.times do |i|          sleep rand(i) # 让线程睡眠一段时间          queue << i   

  • Java多种方式实现生产者消费者模式

    实现需求:两个线程交替打印1,0,打印10轮 java多线程口诀: 高内聚,低耦合 线程操作资源类 判断干活通知 防止虚假唤醒 方式一:使用synchronized和Object的wait和notifyAll方法 wait:使当前线程阻塞 notify,notifyAll唤醒当前线程 /** * 两个线程交替打印1,0 打印10轮 * * @author Administrator * @version 1.0 2020年7月12日 * @see ProdConsumerDemo1 * @sin

  • Java如何通过线程解决生产者/消费者问题

    生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示 生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品.互相等待,从而发生死锁. 以下实例演示了如何通过线程解决生产者/消费者问题: /* author by javaidea.com ProducerConsumerTest.java */ public

随机推荐