java-Runnable加锁实现生产者和消费者的多线程问题

案例:

有一家商品售卖机构,只有一名生产者,两名消费者,请采用多线程的方式对这个案例进行实现。

//库存函数,保存着库存的信息Storage.java

public class Storage {
    //模拟库存
    public Integer num=1;
}

//生产者函数 product.java
/************************************************************   
Copyright (C), 1988-1999, Huawei Tech. Co., Ltd.   
FileName: Customer.java 
Author:     Light   
Version :    version1.0      
Date:       2018/7/11
Description:    生产者进行生产,生产者需要在消费者进行消费后生产,模拟的内存只有一块,
                当没有消费时,会提醒消费者消费,唤醒消费者进程 // 模块描述         
Version:         1.0// 版本信息 
  
Function List:     // 主要函数及其功能     
1.
 History: 
  // 历史修改记录 
      
    <author>  <time>   <version >   <desc>       
      Light    2018/7/11     1.0     build this moudle   

***********************************************************/
public class Product implements Runnable{
    private Storage storage;

    public Product(Storage storage) {
        super();
        this.storage = storage;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(true){
            synchronized (storage) {
                if(this.storage.num<1){
                    //模拟生产
                    this.storage.num++;
                    System.out.println("生产一个");
                    //唤醒队列中所有进程
                    this.storage.notifyAll();
                }else{
                    try {
                        //进入等待队列
                        this.storage.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    }

}

//消费者函数 Customer.java
/************************************************************   
Copyright (C), 1988-1999, Huawei Tech. Co., Ltd.   
FileName: Customer.java 
Author:     Light   
Version :    version1.0      
Date:       2018/7/11
Description:    消费者进行消费,消费者需要在生产者进行生产再进行消费,
                当没有生产时,会提醒生产者生产,唤醒生产者进程 // 模块描述         
Version:         1.0// 版本信息 
  
Function List:     // 主要函数及其功能     
1.
 History: 
  // 历史修改记录 
      
    <author>  <time>   <version >   <desc>       
      Light    2018/7/11     1.0     build this moudle   

***********************************************************/
public class Customer implements Runnable {
    private Storage storage;

    public Customer(Storage storage) {
        super();
        this.storage = storage;
    }
    /**
      * 重写run()
      * @author     [Light](必须)
      * @see      [run()](可选)
      * @since     [version 1.0] (必须)
      */
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(true){
            //加锁
            synchronized (storage) {
                //判断是否生产者进行了生产
                if(this.storage.num>=1){
                    //模拟消费
                    this.storage.num--;
                    System.out.println("消费一个");
                    //唤醒队列所有进程
                    this.storage.notifyAll();
                }else{
                    try {
                        //等待
                        this.storage.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    }

}

//主函数 MyTest.java
/************************************************************   
Copyright (C), 1988-1999, Huawei Tech. Co., Ltd.   
FileName: MyTest.java 
Author:     Light   
Version :    version1.0      
Date:       2018/7/11
Description:   消费生产进程模拟 // 模块描述         
Version:         1.0// 版本信息 
  
Function List:     // 主要函数及其功能     
1.
 History: 
  // 历史修改记录 
      
    <author>  <time>   <version >   <desc>       
      Light    2018/7/11     1.0     build this moudle   

***********************************************************/
public class MyTest {

    public static void main(String[] args) {     //库存
     Storage storage=new Storage();     //生产者
        Product p1=new Product(storage);     //两名消费者
        Customer c1=new Customer(storage);
        Customer c2=new Customer(storage);
        Thread t1=new Thread(p1);
        Thread t2=new Thread(c1);
        Thread t3=new Thread(c2);
        t1.start();
        t2.start();
        t3.start();
  }
}

最终执行结果:

通过对进程的上锁和唤醒,最终实现了生产者和消费者的案例。

原文地址:https://www.cnblogs.com/suifengye/p/9297403.html

时间: 2024-10-30 02:48:03

java-Runnable加锁实现生产者和消费者的多线程问题的相关文章

Java并发编程(4)--生产者与消费者模式介绍

一.前言 这种模式在生活是最常见的,那么它的场景是什么样的呢? 下面是我假象的,假设有一个仓库,仓库有一个生产者和一个消费者,消费者过来消费的时候会检测仓库中是否有库存,如果没有了则等待生产,如果有就先消费直至消费完成:而生产者每天的工作就是先检测仓库是否有库存,如果没有就开始生产,满仓了就停止生产等待消费,直至工作结束.下图是根据假象画的流程图: 那么在程序中怎么才能达到这样的效果呢?下面介绍三种方式实现. 二.使用notify() 和 wait()实现 相信大家这两个方法都不陌生,它是Obj

浅谈Java简单实现的生产者与消费者问题

一.面对生产者和消费者的问题,首先我们得明白几点: 生产者:生产数据:消费者:消费数据.消费者在没有数据可供消费的情况下,不能消费:生产者在原数据没有被消费掉的情况下,不能生产新数据.假设,数据空间只有一个.实际上,如果实现了正确的生产和消费,则,两个线程应该是严格的交替执行. synchronized关键字若用在代码中,形成一个同步块,且,必须要执行锁:    synchronized (锁对象) {        同步块    }同步块使得锁对象称为thread monitor二.代码实现:

Java线程同步模型-生产者与消费者

Java生产者与消费者模型是经典Java线程同步模型,涉及使用同步锁控制生产者线程和消费者线程同步运行问题.同步对象是仓库资源,生产者线程生产向仓库中生产商品,消费者线程从仓库中消费商品,当生产者线程生产的商品达到仓库的90%时,生产者线程停止生产并通知消费者线程开始消费,当消费者线程消耗到仓库的10%时,消费者线程停止消费并通知生产者线程恢复生产,如此循环往复过程. 如下图解: T1时刻分析 T2时刻 T3时刻 T4时刻 上图的分析,T3同T1时刻相同场景,T2同T2时刻相同场景,程序如此循环

Boost lockfree deque 生产者与消费者多对多线程应用

boost库中有一个boost::lockfree::queue类型的 队列,对于一般的需要队列的程序,其效率都算不错的了,下面使用一个用例来说明. 程序是一个典型的生产者与消费者的关系,都可以使用多线程,其效率要比使用上层的互斥锁要快很多,因为它直接使用底层的原子操作来进行同步数据的. freedeque.h 1 #pragma once#ifndef INCLUDED_UTILS_LFRINGQUEUE 2 #define INCLUDED_UTILS_LFRINGQUEUE 3 4 #de

JAVA线程通信之生产者与消费者

package cn.test.hf.test3; import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock; public class FactoryUtils { private Resource resource; private int producerId = 1; // 可重入锁 ReentrantLock lock = new ReentrantLock()

使用java创建kafka的生产者和消费者

创建一个Kafka的主题,连接到zk集群,副本因子3,分区3,主题名是test111        [[email protected] kafka]# bin/kafka-topics.sh --create --zookeeper h5:2181 --topic test111 --replication-factor 3 --partitions 3    查看Kafka的主题详情        [[email protected] kafka]# bin/kafka-topics.sh

JAVA并发实现五(生产者和消费者模式Condition方式实现)

package com.subject01; import java.util.PriorityQueue; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * Condition是在java 1.5中才出现的,它用来替代传统的Object的wait().notify()

练习生产者与消费者-PYTHON多线程中的条件变量同步

以前练习过,但好久不用,手生,概念也生了, 重温一下.. URL: http://www.cnblogs.com/holbrook/tag/%E5%A4%9A%E7%BA%BF%E7%A8%8B/ ~~~~~~~ 互斥锁是最简单的线程同步机制,Python提供的Condition对象提供了对复杂线程同步问题的支持.Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法.线程首先acquire一个条件变量,然后判断一些条件

java线程 生产者与消费者

package org.rui.thread.block; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; /** * 生产者与消费者 * 餐馆 * * @author lenovo * */ public class Restaurant { //Restaurant r=new Restaurant