Java 多线程 经典练习题

该博客通过一个Java程序展示了经典的生产者-消费者问题,使用了线程同步方法来确保线程安全。生产者线程不断生成产品,店员线程在库存未满时接收产品,消费者线程在有产品时消费。店员类作为共享数据,利用`synchronized`关键字和`wait()`、`notify()`实现线程间的通信,确保了资源的正确管理和通知机制。
摘要由CSDN通过智能技术生成
//练习题
 //生产者(Producer) 将产品交给店员(Clerk) 而消费者(Customer)从店员处取走商品
 // 店员一次只能持有固定数量的产品(比如20) 如果生产者试图生产更多的产品
 // 店员会叫生产者停一停 如果店中有空位 再通知生产者 继续生产
 // 如果店中没有了产品 店员会告诉消费者等一下
 // 如果店中有了产品 再通知消费者取走产品
 // 分析1. 是否是多线程问题 ? 是 生产者线程 消费者线程
 // 2. 是否有共享数据? 是 店员(或产品)
 // 3. 如何解决线程安全问题?
 // 4. 是否涉及到线程通信? 是

 Clerk clerk = new Clerk();
 Producer producer = new Producer(clerk);
 Customer customer = new Customer(clerk);
 Thread thread2 = new Thread(producer);
 Thread thread3=new Thread(customer);
 Thread thread4=new Thread(producer);
 thread2.setName("生产者1");
 thread3.setName("消费者1");
 thread4.setName("生产者2");
 thread2.start();
 thread4.start();
 thread3.start();

package com.day7.test;

/**
 * User: Json
 * Date: 2021/8/20
 * 生产者
 **/
public class Producer implements  Runnable{
    private Clerk clerk;
    public Producer(Clerk clerk){
        this.clerk=clerk;
    }
    @Override
    public void run() {
        while (true){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            this.clerk.pro();
        }

    }
}

package com.day7.test;

/**
 * User: Json
 * Date: 2021/8/20
 * 店员
 **/
public class Clerk {
      private int num=0;

    //生产商品
    public synchronized void pro(){

            if(num<20){
                num++;
                System.out.println(Thread.currentThread().getName()+"生产的第"+num+"产品");
                notify();
            }else{
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }


    }

    //消费商品
    public synchronized void Cus(){

            if(num>0){
                System.out.println(Thread.currentThread().getName()+"消费了第"+num+"个产品");
                num--;
                notify();
            }else{
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

    }


}

package com.day7.test;

/**
 * User: Json
 * Date: 2021/8/20
 * 消费者
 **/
public class Customer implements Runnable{
    private Clerk clerk;
    public Customer(Clerk clerk){
        this.clerk=clerk;
    }
    @Override
    public void run() {
        while (true){
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            this.clerk.Cus();
        }


    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Json____

您的鼓励是我创作的动力~

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

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

打赏作者

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

抵扣说明:

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

余额充值