首页 > 编程语言 >Java消费者生产者模式,并发控制。

Java消费者生产者模式,并发控制。

时间:2022-11-12 21:12:13浏览次数:46  
标签:count 货架 goods Java shelves 生产者 并发 商品 println

概论

举个例子:有一个固定容量的货架,生产者放商品进来,消费者拿商品出去,为了保证正常放入和正常拿出(数据的正确性,不会出现超过容量的存放,拿到空气)。使用同步块中的 wait 和 notifAll 方法进行控制。

形如

synchronized (被锁的对象) {
     被锁的对象.wait();            //线程进入阻塞状态,把锁住的资源打开。  
     被锁的对象.notifyAll();      //通知其它所有的线程取消阻塞状态。
}        

商品

//商品
class Love{
    static String love="love";
    public String toString(){
        //所有商品都是love!
        return love;
    }
}

货架

//货架
class Shelves{
    List  goods;//商品
    int  VOLUME=10;//容量

    public Shelves(List goods) {
        this.goods = goods;
    }
}

生产者

//生产者
class Producer implements Runnable{
    Shelves shelves;//货架
    int count;//商品的数量

    //使用的货架
    public Producer(Shelves shelves) {
        this.shelves = shelves;
    }

    //生产商品到放到货架
    public void run() {
        //一直在生产
        while (true) {
            //获取货架上的商品个数
            count=shelves.goods.size();

            synchronized (shelves) {
                if (count > shelves.VOLUME) {
                    System.out.println("货架放不下了,暂停制作");
                    try {
                        //货架资源放出去
                        shelves.wait();
                    } catch (InterruptedException e) { e.printStackTrace(); }
                }else {
                    System.out.println("【生产者】:现在这里有"+count+"个商品");
                    System.out.println("努力制作了1个商品");
                    System.out.println("---------------------");
                    //生产一个商品
                    shelves.goods.add(new Love());
                    //有商品了,告知wait的消费者可以来消费了
                    shelves.notifyAll();
                    try {
                        //每0.5秒做一个
                        Thread.sleep(500);
                    } catch (Exception e) { e.printStackTrace();}
                }
            }
        }
    }
}

消费者

//消费者
class Consumer implements Runnable{
    Shelves shelves;//货架
    int count;//商品的数量
    public Consumer(Shelves shelves){
        this.shelves=shelves;
    }
    //消费者从货架取走商品
    public void run() {
        //每过2秒取走最后一个
        while (true) {
            count=shelves.goods.size();
            synchronized (shelves) {
                if (count == 0) {
                    System.out.println("【消费者】:货架没有商品了,等等吧,等他做出来在买。");
                    try {
                        shelves.wait();
                    } catch (InterruptedException e) { e.printStackTrace(); }
                } else {
                    //买到一个
                    System.out.println("【消费者】:买到1个商品,看看里面什么!----->"+(shelves.goods.get(count-1)).toString());
                    shelves.goods.remove(--count);
                    System.out.println("【消费者】:现在这里还有"+shelves.goods.size()+"个商品");
                    System.out.println("---------------------");
                    //通知制作
                    shelves.notifyAll();
                    try {
                        //每两秒消费一个商品
                        Thread.sleep(2000);
                    } catch (Exception e) { e.printStackTrace();}
                }
            }
        }
    }
}

测试:

public class LeaningThread {
    public static void main(String[] args) {
        //初始化货架,0个商品
        List<Love> list = new ArrayList<>();
        Shelves sl = new Shelves(list);
        //开启生产者线程
        new Thread(new Producer(sl)).start();
        //开启消费者线程
        new Thread(new Consumer(sl)).start();
    }
}

运行结果(手动结束程序运行):

 

注意

wait和notifyAll:必须在synchronized方法或块中使用,通过被锁的对象进行调用。

标签:count,货架,goods,Java,shelves,生产者,并发,商品,println
From: https://www.cnblogs.com/lurenjia-bky/p/16884666.html

相关文章

  • JSP—El表达式,java脚本,java表达式,jstl标签库
    jsp简介JSP(全称JavaServerPages)是由SunMicrosystems公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成HTML、XML或其他格式文档的We......
  • java——静态static关键字001
    stataic关键字概述:           static关键字修饰成员变量:              static关键字修饰成员方法:    ......
  • 小新学Java7-【接口、多态】
    一、接口1.接口概述接口,是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了方法,包含抽象方法(JDK7及......
  • 一、Java中的B/S、MVC、SSM
    一、常见的软件架构体系分为:C/S架构和B/S架构; 二、B/S架构→服务端结构划分→解耦【高内聚、低耦合】:不同的层级负责不同的工作。B/S三层架构:1.表现层(web层......
  • Java 函数式编程 stream流(二)
     Java函数式编程stream流(一)1. Stream和parallelStreamstream是顺序流,由主线程按顺序对流执行操作,而parallelStream是并行流,内部以多线程并行执行的方式对流进......
  • 深入理解Java虚拟机——自动内存管理
    目录内存结构总览程序计数器(寄存器)各种码之间的关系程序计数器的特点虚拟机栈虚拟机栈溢出本地方法栈堆Heap堆内存溢出堆内存诊断方法区永久代和元空间对方法区的实现方法......
  • CentOS7.x下在后台运行和关闭(Java)项目
    需求在一般情况下,在服务器通过java-jarxxx.jar来运行一个jar包。但是如果退出了控制台,那么这个程序就将被关闭。因此让jar包后台运行十分必要。解决方案运行方式一......
  • Java——对象和类—封装001
                                                        ......
  • Java三大特性(三)—多态
    ......
  • javaweb连接多个数据库
    第一步、定义数据库链接config/database.php<?phpreturn['default'=>'mysql','connections'=>[#主要数据库连接'mysql'=>['driver'=>'mysql','host'=>......