Java模拟生产者-消费者问题。生产者不断的往仓库中存放产品,消费者从仓库中消费产品。其中生产者和消费者都可以有若干个。在这里,生产者是一个线程,消费者是一个线程。仓库容量有限,只有库满时生产者不能存

简介: 该博客文章通过Java代码示例演示了生产者-消费者问题,其中生产者在仓库未满时生产产品,消费者在仓库有产品时消费产品,通过同步机制确保多线程环境下的线程安全和有效通信。

Java模拟生产者-消费者问题。生产者不断的往仓库中存放产品,消费者从仓库中消费产品。其中生产者和消费者都可以有若干个。在这里,生产者是一个线程,消费者是一个线程。仓库容量有限,只有库满时生产者不能存

需求分析:生产者生产产品,存放在仓库里,消费者从仓库里消费产品。
程序分析:
1、生产者仅仅在仓储未满时候生产,仓满则停止生产。
2、消费者仅仅在仓储有产品时候才能消费,仓空则等待。
3、当消费者发现仓储没产品可消费时候会通知生产者生产。
4、生产者在生产出可消费产品时候,应该通知等待的消费者去消费。

package duoxiancheng;

public class ProducersAndConsumers {
    public static void main(String[] args) {
        Storage storage = new Storage();
        Thread consumer = new Thread(new Consumer(storage));
        consumer.setName("消费者");
        Thread producer = new Thread(new Producer(storage));
        producer.setName("生产者");
        consumer.start();
        producer.start();
    }
}

/**
 * 消费者
 */
class Consumer implements Runnable {
    private Storage storage;

    public Consumer(Storage storage) {
        this.storage = storage;
    }

    @Override
    public void run() {
        storage.pop();// 从仓库中取出商品
    }
}

/**
 * 生产者
 */
class Producer implements Runnable {
    private Storage storage;

    public Producer(Storage storage) {
        this.storage = storage;
    }

//手动输入商品
    @Override
    public void run() {
        Product product = new Product("0001", "手机");
        Product product2 = new Product("0002", "平板");
        storage.push(product);
        storage.push(product2);
    }

}

/**
 * 产品类
 */
class Product {
    private String id;// 产品id
    private String name;// 产品名称

    public Product(String id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "(产品ID:" + id + " 产品名称:" + name + ")";
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

/**
 * 仓库
 */
class Storage {
    // 仓库容量为10
    private Product[] products = new Product[10];
    private int top = 0;

    // 生产者往仓库中放入产品,定义临界区域。同步方法机制
    public synchronized void push(Product product) {
        while (top == products.length) {
            try {
                wait();// 仓库已满,等待
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        // 把产品放入仓库
        products[top++] = product;
        System.out.println(Thread.currentThread().getName() + " 生产了产品" + product);
        notifyAll();// 唤醒等待线程

    }

    // 消费者从仓库中取出产品
    public synchronized Product pop() {
        while (top == 0) {
            try {
                wait();// 仓库空,等待
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        // 从仓库中取产品
        --top;
        Product p = new Product(products[top].getId(), products[top].getName());
        products[top] = null;
        System.out.println(Thread.currentThread().getName() + " 消费了产品" + p);
        notifyAll();// 唤醒等待线程
        return p;
    }
}
相关文章
|
4天前
|
安全 Java UED
Java中的多线程编程:从基础到实践
本文深入探讨了Java中的多线程编程,包括线程的创建、生命周期管理以及同步机制。通过实例展示了如何使用Thread类和Runnable接口来创建线程,讨论了线程安全问题及解决策略,如使用synchronized关键字和ReentrantLock类。文章还涵盖了线程间通信的方式,包括wait()、notify()和notifyAll()方法,以及如何避免死锁。此外,还介绍了高级并发工具如CountDownLatch和CyclicBarrier的使用方法。通过综合运用这些技术,可以有效提高多线程程序的性能和可靠性。
|
3天前
|
缓存 Java UED
Java中的多线程编程:从基础到实践
【10月更文挑战第13天】 Java作为一门跨平台的编程语言,其强大的多线程能力一直是其核心优势之一。本文将从最基础的概念讲起,逐步深入探讨Java多线程的实现方式及其应用场景,通过实例讲解帮助读者更好地理解和应用这一技术。
19 3
|
5天前
|
缓存 安全 Java
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
13 2
|
6天前
|
存储 安全 Java
Java-如何保证线程安全?
【10月更文挑战第10天】
|
7天前
|
Java
|
1天前
|
缓存 算法 Java
|
7天前
|
Java 应用服务中间件 测试技术
Java21虚拟线程:我的锁去哪儿了?
【10月更文挑战第8天】
19 0
|
Java
java之wait()、notify()实现非阻塞的生产者和消费者
java之wait()、notify()实现非阻塞的生产者和消费者
237 0
一个使用Java BlockingQueue实现的生产者和消费者
一个使用Java BlockingQueue实现的生产者和消费者
112 0
|
Java 存储
用JAVA 实现“生产者-消费者”问题
生产者和消费者问题是从操作系统中的许多实际同步问题中抽象出来的具有 代表性的问题。它反映了操作系统中典型的同步例子。   生产者进程(进程由多个线程组成)生产信息,例如它可以是计算进程。消费 者进程使用信息,它可以是输出打印进程。
815 0