多线程之生产者消费者模型详解

    科技2022-09-07  101

    用多线程完成生产者消费者模型,生产者生产一个产品就等待消费者消费

    使用多线程

    public static void main(String[] args) { //使用多线程完成生产者消费者模型 Shop shop = new Shop(); ProducerThread pt = new ProducerThread(shop); ConsumerThread ct = new ConsumerThread(shop); pt.setName("生产者"); ct.setName("消费者"); pt.start(); ct.start(); } } //4.创建消费者线程 class ConsumerThread extends Thread{ //共享数据 Shop shop; public ConsumerThread(Shop shop){ this.shop = shop; } @Override public void run() { for (int i = 0; i < 10; i++) { try { shop.getProduct(); } catch (InterruptedException e) { e.printStackTrace(); } } } } //3.创建生产者线程 class ProducerThread extends Thread{ //共享数据 Shop shop; public ProducerThread(Shop shop){ this.shop = shop; } @Override public void run() { try { for (int i = 0; i < 10; i++) { shop.putProduct(new Phone("小米手机"+(i+1))); } } catch (InterruptedException e) { e.printStackTrace(); } } } //2.定义一个商店类(相当于一个缓冲区) class Shop{ Phone phone;//商品 boolean flag = false;//表示商品的状态,false表示没有商品等待生产。true表示已有上商品等待消费 /** * wait方法必须要出现在同步代码块或者同步方法中 * 不然会报java.lang.IllegalMonitorStateException */ /** * 进货(生产) */ public synchronized void putProduct(Phone phone) throws InterruptedException { if (flag == true){//表示已有商品,等待消费 this.wait(); } //此处flag=false,表示要生产 System.out.println(Thread.currentThread().getName()+"生产了"+phone.name); //模拟商店进货 this.phone = phone; //改变商品状态 flag = true; //通知消费者消费 notify(); } /** * 出货(消费) */ public synchronized void getProduct() throws InterruptedException { if (flag == false){//表示消费者等待生产 this.wait(); } //此处的flag = true System.out.println(Thread.currentThread().getName()+"消费了"+phone.name); //模拟消费 this.phone = null; //改变商品状态 flag = false; //通知生产者 this.notify(); } } //1.定义一个商品类 class Phone{ String name; public Phone(String name){ this.name = name; }

    打印结果: 生产者生产了小米手机1 消费者消费了小米手机1 生产者生产了小米手机2 消费者消费了小米手机2 生产者生产了小米手机3 消费者消费了小米手机3 生产者生产了小米手机4 消费者消费了小米手机4 生产者生产了小米手机5 消费者消费了小米手机5 生产者生产了小米手机6 消费者消费了小米手机6 生产者生产了小米手机7 消费者消费了小米手机7 生产者生产了小米手机8 消费者消费了小米手机8 生产者生产了小米手机9 消费者消费了小米手机9 生产者生产了小米手机10 消费者消费了小米手机10

    Processed: 0.008, SQL: 9