多线程13/经典例题:生产者/消费者问题⭐

本文探讨了经典的生产者/消费者问题,描述了当生产者尝试超过库存极限生产产品,以及消费者可能错过或重复获取数据的情况。通过分析确认问题涉及到多线程、共享数据和线程安全。解决方案包括使用同步机制和线程通信,通过synchronized关键字、notify()和wait()实现。文章还介绍了实现该问题的Java代码结构,包括Clerk、Productor和Customer类,并指出构造器用于共享资源。课后问题讨论了构造器在类中的作用。
摘要由CSDN通过智能技术生成

经典例题:生产者/消费者问题

●生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品,店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;如果店中没有产品了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。
●这里可能出现两个问题:

1. 生产者比消费者快时,消费者会漏掉一些数据没有取到。
2. 消费者比生产者快时,消费者会取相同的数据。


分析:
3. 是否是多线程问题? 是,生产者线程,消费者线程
4. 是否有共享数据? 是,店员(或产品)
5. 如何解决线程的安全问题? 同步机制,有三种方法
6. 是否涉及线程的通信? 是


思路:

1. 首先建立店员(Clerk)类,生产者(Productor)类继承Thread,消费者(Customer)类继承Thread
2. 将生产者(Productor)类,消费者(Customer)类都去声明private Clerk clerk这个变量,建立相应构造器;以便实现共用资源。
3. 在主函数中造Clerk对象,new生产者与消费者两个线程。
4. Clerk类中实现生产与消费的具体操作:生产produceProduct(),消费consumeProduct(),并使用synchronized实现线程安全。添加notify()与wait()实现线程通信。
5. Productor与Customer类中各自重写run()方法,分别调用produceProduct(),consumeProduct()

答案:

package com.dxc;


class Clerk{
   

    private int productCount = 0;
    //生产产品
    public synchronized void produceProduct(){
   
        if (productCount < 20){
   
            productCount++;
            System.out.println(Thread.currentThread().getName(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值