0
点赞
收藏
分享

微信扫一扫

多线程——java练习题2

产品喵dandan米娜 2022-04-30 阅读 28
package com.chang.exer;

/**
 * 题目:生产者将产品交给店员,消费者从店员处取走产品,店员一次最多只能持有固定数量(20)产品满仓时叫停生产者生产,售出产品后有仓位时通知生产者继续生产;产品售空时通知消费者等待,进货后通知消费者来购买。
 * 要求:简单体现多线程执行和通信特点即可。
 * <p>
 * 分析
 * 1. 类:生产者类、店员类、消费者类;类的组合:生产者类{店员类型属性}、消费者类{店员类型属性}
 * 2. 线程1:消费者从店员处购买产品,消费线程;线程2:店员从生产者进货产品,进货和生产线程;
 * 3. 共享数据:产品数量(声明在店员类属性里,这样可以产生交互);
 * 4. 线程通信:线程1产品售空时wait,产品售出时唤醒线程2;线程2满仓时wait,进货时唤醒线程1;
 * 5.简化:逐个消费、逐个生产。
 *
 * @author Cao Longchang
 * @create 2022-04-29 17:54
 */

// 测试类
class ProductTest {
    public static void main(String[] args) {
        Clerk cle1 = new Clerk();
        Consumer con1 = new Consumer(cle1);
        Consumer con2 = new Consumer(cle1);
        Consumer con3 = new Consumer(cle1);
        Producer1 pro = new Producer1(cle1);

        Thread threadCon1 = new Thread(con1);
        Thread threadCon2 = new Thread(con2);
        Thread threadCon3 = new Thread(con3);
        Thread threadPro = new Thread(pro);

        threadCon1.setName("消费者甲");
        threadCon2.setName("消费者乙");
        threadCon3.setName("消费者丙");
        threadPro.setName("生产者");

        threadCon1.start();
        threadCon2.start();
        threadCon3.start();
        threadPro.start();
    }
}

// 生产者类
class Producer1 implements Runnable {
    private Clerk clerk;

    public Producer1(Clerk clerk) {
        this.clerk = clerk;
    }

    @Override
    public void run() {
        while (true) {
            clerk.produce();
        }
    }
}

// 店员类
class Clerk {
    // 仓位常量
    final int POSITION = 20;

    // 产品数量
    int products = 0;

    // 生产、消费产品数量
    int countP = 0;
    int countC = 0;

    synchronized void produce() {
        if (products < POSITION) {
            countP++;
            System.out.println(Thread.currentThread().getName() + "开始生产第" + countP + "个产品");
            products++;
            System.out.println("库存:" + products);
            this.notify();

            // 强制阻塞,控制生产频率
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } else {
            // 货物满仓,生产线程wait
            System.out.println("店员对" + Thread.currentThread().getName() + "说:已满仓,先不生产!");
            System.out.println("库存:" + products);
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    synchronized void consumption() {
        if (products > 0) {
            countC++;
            System.out.println(Thread.currentThread().getName() + "开始消费第" + countC + "个产品");
            products--;
            System.out.println("库存:" + products);
            this.notify();

            // 强制阻塞,控制消费频率
            try {
                Thread.sleep(90);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        } else {
            // 货物售空,消费线程wait
            System.out.println("店员对" + Thread.currentThread().getName() + "说:对不起,已售空,请下次再来!");
            System.out.println("库存:" + products);
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

// 消费者类
class Consumer implements Runnable {
    private Clerk clerk;

    public Consumer(Clerk clerk) {
        this.clerk = clerk;
    }

    @Override
    public void run() {
        while (true) {
            clerk.consumption();
        }
    }
}

运行结果:
店员对消费者甲说:对不起,已售空,请下次再来!
库存:0
生产者开始生产第1个产品
库存:1
消费者乙开始消费第1个产品
库存:0
店员对消费者乙说:对不起,已售空,请下次再来!
库存:0
店员对消费者丙说:对不起,已售空,请下次再来!
库存:0
生产者开始生产第2个产品
库存:1
生产者开始生产第3个产品
库存:2
生产者开始生产第4个产品
库存:3
生产者开始生产第5个产品
库存:4
生产者开始生产第6个产品
库存:5
生产者开始生产第7个产品
库存:6
生产者开始生产第8个产品
库存:7
生产者开始生产第9个产品
库存:8
生产者开始生产第10个产品
库存:9
消费者甲开始消费第2个产品
库存:8
消费者甲开始消费第3个产品
库存:7
消费者甲开始消费第4个产品
库存:6
消费者甲开始消费第5个产品
库存:5
消费者甲开始消费第6个产品
库存:4
消费者甲开始消费第7个产品
库存:3
消费者甲开始消费第8个产品
库存:2
消费者甲开始消费第9个产品
库存:1
消费者甲开始消费第10个产品
库存:0
店员对消费者甲说:对不起,已售空,请下次再来!
库存:0
店员对消费者丙说:对不起,已售空,请下次再来!
库存:0
店员对消费者乙说:对不起,已售空,请下次再来!
库存:0
生产者开始生产第11个产品
库存:1
生产者开始生产第12个产品
库存:2
生产者开始生产第13个产品
库存:3
生产者开始生产第14个产品
库存:4
生产者开始生产第15个产品
库存:5
生产者开始生产第16个产品
库存:6
生产者开始生产第17个产品
库存:7
生产者开始生产第18个产品
库存:8
生产者开始生产第19个产品
库存:9
生产者开始生产第20个产品
库存:10
生产者开始生产第21个产品
库存:11
生产者开始生产第22个产品
库存:12
生产者开始生产第23个产品
库存:13
生产者开始生产第24个产品
库存:14
生产者开始生产第25个产品
库存:15
生产者开始生产第26个产品
库存:16
生产者开始生产第27个产品
库存:17
生产者开始生产第28个产品
库存:18
生产者开始生产第29个产品
库存:19
生产者开始生产第30个产品
库存:20
店员对生产者说:已满仓,先不生产!
库存:20
消费者甲开始消费第11个产品
库存:19
消费者甲开始消费第12个产品
库存:18
消费者甲开始消费第13个产品
库存:17
消费者甲开始消费第14个产品
库存:16
消费者甲开始消费第15个产品
库存:15
消费者甲开始消费第16个产品
库存:14
消费者甲开始消费第17个产品
库存:13
消费者甲开始消费第18个产品
库存:12
消费者甲开始消费第19个产品
库存:11
消费者甲开始消费第20个产品
库存:10
消费者甲开始消费第21个产品
库存:9
消费者甲开始消费第22个产品
库存:8
消费者甲开始消费第23个产品
库存:7
消费者甲开始消费第24个产品
库存:6
消费者甲开始消费第25个产品
库存:5
消费者甲开始消费第26个产品
库存:4
消费者甲开始消费第27个产品
库存:3
消费者甲开始消费第28个产品
库存:2
消费者甲开始消费第29个产品
库存:1
消费者甲开始消费第30个产品
库存:0
店员对消费者甲说:对不起,已售空,请下次再来!
库存:0
店员对消费者乙说:对不起,已售空,请下次再来!
库存:0
店员对消费者丙说:对不起,已售空,请下次再来!
库存:0
生产者开始生产第31个产品
库存:1
生产者开始生产第32个产品
库存:2
生产者开始生产第33个产品
库存:3
生产者开始生产第34个产品
库存:4
生产者开始生产第35个产品
库存:5
生产者开始生产第36个产品
库存:6
生产者开始生产第37个产品
库存:7
生产者开始生产第38个产品
库存:8
生产者开始生产第39个产品
库存:9
生产者开始生产第40个产品
库存:10
生产者开始生产第41个产品
库存:11
生产者开始生产第42个产品
库存:12
生产者开始生产第43个产品
库存:13
生产者开始生产第44个产品
库存:14
生产者开始生产第45个产品
库存:15
生产者开始生产第46个产品
库存:16
生产者开始生产第47个产品
库存:17
生产者开始生产第48个产品
库存:18
生产者开始生产第49个产品
库存:19
生产者开始生产第50个产品
库存:20
店员对生产者说:已满仓,先不生产!
库存:20
消费者甲开始消费第31个产品
库存:19
消费者甲开始消费第32个产品
库存:18
消费者甲开始消费第33个产品
库存:17
消费者甲开始消费第34个产品
库存:16
消费者甲开始消费第35个产品
库存:15
消费者甲开始消费第36个产品
库存:14
消费者甲开始消费第37个产品
库存:13
消费者甲开始消费第38个产品
库存:12
消费者甲开始消费第39个产品
库存:11
消费者甲开始消费第40个产品
库存:10
消费者甲开始消费第41个产品
库存:9
消费者甲开始消费第42个产品
库存:8
消费者甲开始消费第43个产品
库存:7
消费者甲开始消费第44个产品
库存:6
消费者甲开始消费第45个产品
库存:5
消费者甲开始消费第46个产品
库存:4
消费者甲开始消费第47个产品
库存:3
消费者甲开始消费第48个产品
库存:2
消费者甲开始消费第49个产品
库存:1
消费者甲开始消费第50个产品
库存:0
店员对消费者甲说:对不起,已售空,请下次再来!
库存:0
店员对消费者乙说:对不起,已售空,请下次再来!
库存:0
店员对消费者丙说:对不起,已售空,请下次再来!
库存:0
生产者开始生产第51个产品
库存:1
生产者开始生产第52个产品
库存:2
生产者开始生产第53个产品
库存:3
生产者开始生产第54个产品
库存:4
生产者开始生产第55个产品
库存:5
生产者开始生产第56个产品
库存:6
生产者开始生产第57个产品
库存:7
生产者开始生产第58个产品
库存:8
生产者开始生产第59个产品
库存:9
生产者开始生产第60个产品
库存:10
生产者开始生产第61个产品
库存:11
生产者开始生产第62个产品
库存:12
生产者开始生产第63个产品
库存:13
生产者开始生产第64个产品
库存:14
生产者开始生产第65个产品
库存:15
生产者开始生产第66个产品
库存:16
生产者开始生产第67个产品
库存:17
生产者开始生产第68个产品
库存:18
生产者开始生产第69个产品
库存:19
生产者开始生产第70个产品
库存:20
店员对生产者说:已满仓,先不生产!
库存:20
消费者甲开始消费第51个产品
库存:19
消费者甲开始消费第52个产品
库存:18
消费者甲开始消费第53个产品
库存:17
消费者甲开始消费第54个产品
库存:16
消费者甲开始消费第55个产品
库存:15
消费者甲开始消费第56个产品
库存:14
消费者甲开始消费第57个产品
库存:13
消费者甲开始消费第58个产品
库存:12
消费者甲开始消费第59个产品
库存:11
消费者甲开始消费第60个产品
库存:10
消费者甲开始消费第61个产品
库存:9
消费者甲开始消费第62个产品
库存:8
消费者甲开始消费第63个产品
库存:7
消费者甲开始消费第64个产品
库存:6
消费者甲开始消费第65个产品
库存:5
消费者甲开始消费第66个产品
库存:4
消费者甲开始消费第67个产品
库存:3
消费者甲开始消费第68个产品
库存:2
消费者甲开始消费第69个产品
库存:1
消费者甲开始消费第70个产品
库存:0
店员对消费者甲说:对不起,已售空,请下次再来!
库存:0
店员对消费者丙说:对不起,已售空,请下次再来!
库存:0
店员对消费者乙说:对不起,已售空,请下次再来!
库存:0
生产者开始生产第71个产品
库存:1
生产者开始生产第72个产品
库存:2
生产者开始生产第73个产品
库存:3
生产者开始生产第74个产品
库存:4
生产者开始生产第75个产品
库存:5
生产者开始生产第76个产品
库存:6
生产者开始生产第77个产品
库存:7
生产者开始生产第78个产品
库存:8
生产者开始生产第79个产品
库存:9
生产者开始生产第80个产品
库存:10
生产者开始生产第81个产品
库存:11
生产者开始生产第82个产品
库存:12
生产者开始生产第83个产品
库存:13
生产者开始生产第84个产品
库存:14
生产者开始生产第85个产品
库存:15
生产者开始生产第86个产品
库存:16
生产者开始生产第87个产品
库存:17
生产者开始生产第88个产品
库存:18
生产者开始生产第89个产品
库存:19
生产者开始生产第90个产品
库存:20
店员对生产者说:已满仓,先不生产!
库存:20
消费者甲开始消费第71个产品
库存:19
消费者甲开始消费第72个产品
库存:18
消费者甲开始消费第73个产品
库存:17
消费者甲开始消费第74个产品
库存:16
消费者甲开始消费第75个产品
库存:15
消费者甲开始消费第76个产品
库存:14
消费者甲开始消费第77个产品
库存:13
消费者甲开始消费第78个产品
库存:12
消费者甲开始消费第79个产品
库存:11
消费者甲开始消费第80个产品
库存:10
消费者甲开始消费第81个产品
库存:9
消费者甲开始消费第82个产品
库存:8
消费者甲开始消费第83个产品
库存:7
消费者甲开始消费第84个产品
库存:6
消费者甲开始消费第85个产品
库存:5
消费者甲开始消费第86个产品
库存:4
消费者甲开始消费第87个产品
库存:3
消费者甲开始消费第88个产品
库存:2
消费者甲开始消费第89个产品
库存:1
消费者甲开始消费第90个产品
库存:0
店员对消费者甲说:对不起,已售空,请下次再来!
库存:0
店员对消费者乙说:对不起,已售空,请下次再来!
库存:0
店员对消费者丙说:对不起,已售空,请下次再来!
库存:0
生产者开始生产第91个产品
库存:1
生产者开始生产第92个产品
库存:2
生产者开始生产第93个产品
库存:3
生产者开始生产第94个产品
库存:4
生产者开始生产第95个产品
库存:5
生产者开始生产第96个产品
库存:6
生产者开始生产第97个产品
库存:7
生产者开始生产第98个产品
库存:8
生产者开始生产第99个产品
库存:9
生产者开始生产第100个产品
库存:10
生产者开始生产第101个产品
库存:11
生产者开始生产第102个产品
库存:12
生产者开始生产第103个产品
库存:13
生产者开始生产第104个产品
库存:14
生产者开始生产第105个产品
库存:15
生产者开始生产第106个产品
库存:16
生产者开始生产第107个产品
库存:17
生产者开始生产第108个产品
库存:18
生产者开始生产第109个产品
库存:19
生产者开始生产第110个产品
库存:20
店员对生产者说:已满仓,先不生产!
库存:20
消费者甲开始消费第91个产品
库存:19
消费者甲开始消费第92个产品
库存:18
消费者甲开始消费第93个产品
库存:17
消费者甲开始消费第94个产品
库存:16
消费者甲开始消费第95个产品
库存:15
消费者甲开始消费第96个产品
库存:14
消费者甲开始消费第97个产品
库存:13
消费者甲开始消费第98个产品
库存:12
消费者甲开始消费第99个产品
库存:11
消费者甲开始消费第100个产品
库存:10
消费者甲开始消费第101个产品
库存:9
消费者甲开始消费第102个产品
库存:8
消费者甲开始消费第103个产品
库存:7
消费者甲开始消费第104个产品
库存:6
消费者甲开始消费第105个产品
库存:5
消费者甲开始消费第106个产品
库存:4
消费者甲开始消费第107个产品
库存:3
消费者甲开始消费第108个产品
库存:2
消费者甲开始消费第109个产品
库存:1
消费者甲开始消费第110个产品
库存:0
店员对消费者甲说:对不起,已售空,请下次再来!
库存:0
店员对消费者乙说:对不起,已售空,请下次再来!
库存:0
店员对消费者丙说:对不起,已售空,请下次再来!
库存:0
生产者开始生产第111个产品
库存:1
生产者开始生产第112个产品
库存:2
生产者开始生产第113个产品
库存:3
生产者开始生产第114个产品
库存:4
生产者开始生产第115个产品
库存:5
消费者甲开始消费第111个产品
库存:4
消费者甲开始消费第112个产品
库存:3
消费者甲开始消费第113个产品
库存:2
消费者甲开始消费第114个产品
库存:1
消费者甲开始消费第115个产品
库存:0
店员对消费者甲说:对不起,已售空,请下次再来!
库存:0
生产者开始生产第116个产品
库存:1
生产者开始生产第117个产品
库存:2
生产者开始生产第118个产品
库存:3
生产者开始生产第119个产品
库存:4
生产者开始生产第120个产品
库存:5
生产者开始生产第121个产品
库存:6
生产者开始生产第122个产品
库存:7
消费者丙开始消费第116个产品
库存:6
消费者丙开始消费第117个产品
库存:5
消费者丙开始消费第118个产品
库存:4
消费者丙开始消费第119个产品
库存:3
消费者丙开始消费第120个产品
库存:2
消费者乙开始消费第121个产品
库存:1
消费者乙开始消费第122个产品
库存:0
店员对消费者乙说:对不起,已售空,请下次再来!
库存:0
生产者开始生产第123个产品
库存:1
生产者开始生产第124个产品
库存:2
生产者开始生产第125个产品
库存:3
生产者开始生产第126个产品
库存:4
生产者开始生产第127个产品
库存:5
生产者开始生产第128个产品
库存:6
生产者开始生产第129个产品
库存:7
生产者开始生产第130个产品
库存:8
生产者开始生产第131个产品
库存:9
生产者开始生产第132个产品
库存:10
生产者开始生产第133个产品
库存:11
生产者开始生产第134个产品
库存:12
生产者开始生产第135个产品
库存:13

// 手动停止运行
Process finished with exit code -1

举报

相关推荐

多线程练习题

Java基础练习题2

Java练习题

java练习题

java for 循环练习题

0 条评论