篮子-水果模拟消费者生产者

复制代码
package com.iotec.synchronizedTest;

import java.util.LinkedList;

public class ProductorConsumerDemo {
    public static void main(String[] args) {
        Backet backet = new Backet();
        Productor productor = new Productor(backet);
        Consumer consumer = new Consumer(backet);
        productor.start();
        consumer.start();
    }
}

class Productor extends Thread{
    private Backet backet = null;
    public Productor(Backet backet){
        super();
        this.backet = backet;
    }

    @Override
    public void run() {
        backet.pushApple();
    }
}

class Consumer extends Thread{
    private Backet backet = null;
    public Consumer(Backet backet){
        super();
        this.backet = backet;
    }

    @Override
    public void run() {
        backet.popApple();
    }
}

class Backet{
    private LinkedList<Apple> basket = new LinkedList<>();

    //放4轮苹果
    public synchronized void pushApple(){
        for(int i = 0;i<20;i++){
            Apple apple = new Apple(i);
            push(apple);
        }
    }
    public synchronized void popApple(){
        for(int i = 0;i<20;i++) {
            pop();
        }
    }


    //向篮子放苹果
    private void push(Apple apple){
        //当篮子中存放了5个苹果就等待并通知消费者来消费
        if(basket.size()==5){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }//等待并释放当前对象的锁
        }
        try {
            //当不满足5个的时候,则每隔500毫秒放一个苹果
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        basket.addFirst(apple);
        System.out.println("存放:"+apple.toString());
        notify(); //通知消费者来消费
    }


    //向篮子取苹果
    private void pop(){
        //当篮子中存放了0个苹果就等待并通知生产者来生产
        if(basket.size()==0){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }//等待并释放当前对象的锁
        }
        try {
            //当不满足5个的时候,则每隔500毫秒放一个苹果
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Apple apple = basket.removeFirst();
        System.out.println("吃掉:"+apple.toString());
        notify(); //通知生产者生产
    }
}

class Apple{
    private int id;
    public Apple(int id){
        this.id = id;
    }

    @Override
    public String toString() {
        return "Appple:"+(id+1);
    }
}
复制代码

 



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   君莫笑我十年游  阅读(198)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示