生产者消费者模式案例

需求:

1.有一个仓库,容量为7,可以存放 A-G字符。

2.默认仓库里没有字符,消费者想从仓库中一个一个的获取字符,所以要通知生产者生产字符,生产者则开始生产A,B,C...G字符放入仓库中。

3.当仓库已满,则生产者通知消费者开始消费字符,则消费者按照A-G字符顺序一个个取字符,当仓库被取空后,则消费者通知生产者开始生产。

4.生产者和消费者按照每秒一个字符的速度生产和消费字符。

生产者线程:

package producerandconsumer;

import java.util.Random;

public class Produder extends Thread{

    Warehouse warehouse;

    public Produder(Warehouse warehouse) {
        this.warehouse = warehouse;
    }

    @Override
    public void run() {

        Random random = new Random();

        while (true){
            synchronized (warehouse){
                if (warehouse.characters.size()>=Warehouse.MAX){
                    try {
                        warehouse.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }






                for (int i = 65; i <65+7 ; i++) {
                    System.out.println("开始生产字母"+(char)i);
                    warehouse.characters.add((char) i);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
                System.out.println("仓库此时有"+warehouse.characters.size()+"个字母");


                warehouse.notify();        //唤醒消费者线程



            }
        }




    }
}

消费者线程:

package producerandconsumer;

import java.util.Iterator;
import java.util.Random;

public class Consumer extends Thread{

    Warehouse warehouse;

    public Consumer(Warehouse warehouse) {
        this.warehouse = warehouse;
    }

    @Override
    public void run() {
        Random random = new Random();

        while (true){
            synchronized (warehouse){
                if (warehouse.characters.size()<=0){
                    try {
                        warehouse.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }


//------------------------------------随机消费代码如下:------------------------------------------
//                int count = random.nextInt(warehouse.characters.size())+1;      //随机消费字母
//
//
//               warehouse.characters.removeAll(warehouse.characters.subList(0,count));
               //随机删除集合里的字母
//
//
//                System.out.println("随机消费字母"+count+"个,仓库此时有"+warehouse.characters.size()+"个字母");


                Iterator<Character> iterator = warehouse.characters.iterator();
                if (iterator.hasNext()){
                    System.out.println("删除了"+iterator.next());
                    iterator.remove();
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }


                warehouse.notify();        //唤醒消费者线程



            }
        }

    }



}

仓库:

package producerandconsumer;

import java.util.ArrayList;
import java.util.List;

public class Warehouse {

    public static int MAX =7;

    public List<Character> characters = new ArrayList<>();


}

测试类:

package producerandconsumer;

public class Test {

    public static void main(String[] args) {
        Warehouse warehouse = new Warehouse();

        Consumer consumer = new Consumer(warehouse);
        Produder produder = new Produder(warehouse);

        produder.start();
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        consumer.start();

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值