Java学习:线程类简单应用(生产者消费者模型)

Java学习:线程类简单应用(生产者消费者模型)

设有一个最大库存为5的小书橱(有界缓冲池),每次有一批书要入库(生产),同时会有一定读者对书库的书购买(消费).

使用synchronized关键字的同步方法避免丢失修改的情况.

图解:

生产者消费者模型

结果:

最大库存为5小书库已构建!
图书入库:小书库,当前库存:1
图书入库:小书库,当前库存:2
图书入库:小书库,当前库存:3
图书入库:小书库,当前库存:4
图书入库:小书库,当前库存:5
图书出库:小书库,当前库存:4
图书出库:小书库,当前库存:3
图书出库:小书库,当前库存:2
图书出库:小书库,当前库存:1
图书出库:小书库,当前库存:0

代码:

// 测试类
public class TestLittleLibrary {
    public static void main(String[] args) {
        LittleLibrary library = new LittleLibrary("小书库",5);// 库存5的小书橱
        System.out.println("最大库存为" + library.getSIZE() + library.getName() + "已构建!");
        Booker booker = new Booker(library);// 生产者
        Reader reader = new Reader(library);// 消费者
        booker.start();
        reader.start();
    }
}
// 作为缓冲池的库类
public class LittleLibrary {
    private String name;// 书名
    private int SIZE;// 最大库存
    private int num;// 当前库存量

    public LittleLibrary(String name, int size) {
        this.name = name;
        this.SIZE = size;
    }

    // 同步的入库(生产)方法
    public synchronized void input() {
        // 若当前库存量为最大库存量,进入等待直到被通知唤醒
        while (num == SIZE) {
            try {
                wait();
            }catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        num++;
        System.out.println("图书入库:" + getName() + ",当前库存:" + num);
        notifyAll();// 通知出库(消费)
    }

    // 同步的出库(消费)方法
    public synchronized void output() {
        // 若库中无书,则进入等待直到被通知唤醒
        while (num == 0) {
            try {
                wait();
            }catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        num--;
        System.out.println("图书出库:" + getName() + ",当前库存:" + num);
        notifyAll();// 通知入库(生产)
    }

    public String getName() {
        return name;
    }

    public int getSIZE() {
        return SIZE;
    }

}
// 生产者线程
public class Booker extends Thread {
    LittleLibrary library;
    public Booker(LittleLibrary library) {
        this.library = library;
    }

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            library.input();// 调用同步入库方法
        }
    }
}
// 消费者线程
public class Reader extends Thread {
    LittleLibrary library;
    public Reader(LittleLibrary library) {
        this.library = library;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i ++) {
            library.output();// 调用同步消费方法
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

满目代码皆为你

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值