java用同步锁来做高并发简单案例

这个案例是生产者和消费这,还有店员,那么店员是介于生产者和消费中间人。他工作是吧钱结算清除,把产品卖给客户

class Productor implements Runnable{//开始第一步
    private Clerk c1;//开始第3步,开始直接用声明变量的方式,声明Clerk,因为他是要共享的类。只是做了声明,但是里面是空的。啥东西都没有的。没有地址的。

    public Productor(Clerk c1){//第4步同样,声明完毕后,要能接收,进行主程序开始调用的时候,进行方便接入。
        this.c1=c1;//这里声明后,肯定要把它赋值,问题是从谁身上赋值呢?本身是一个类。所以要从外部进行赋值。
    }

    @Override
    public void run() {//开始第一步




        while(true){

                System.out.println("生产商开始生产");
                c1.addProduct();//开始第2步,难点这边如何去调用共享数据这个呢?



        }
    }

}

class Clerk{//开始第一步
    private int produNum=0;//开始第2步

    //属性的修改都是通过方法来做。!!!!!!!!!!!!!!!!!!!

    public Clerk() {
    }



    public int getProduNum() {
        return produNum;
    }

    public void setProduNum(int produNum) {
        this.produNum = produNum;
    }

    public synchronized void addProduct(){

        if (produNum<20){
            produNum++;//开始第2步
            System.out.println(Thread.currentThread().getName()+"生产者增加到产品为"+produNum);
            this.notify();

        }else if(produNum>=20){
            try {
                wait();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }

    }
    public synchronized void minProduct(){


        if (produNum<=0) {
            try {
                wait();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

        }else{
            produNum--;//开始第2步
            System.out.println(Thread.currentThread().getName()+"消费者吃掉产品为"+produNum);
            this.notify();
        }


    }

}

class Customer implements Runnable{//开始第一步

    private Clerk c1;

    public Customer(Clerk c1) {
        this.c1 = c1;
    }

    @Override
    public void run() {//开始第一步
        while(true){//开始第2步
            System.out.println("开始吃掉产品");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            c1.minProduct();//开始第2步


        }
    }

}

package com.sgg.Threadcommunication.exer1;

public class produceandcomsusion {
    public static void main(String[] args) {

        Clerk c1=new Clerk();
        Productor p=new Productor(c1);
        Customer c=new Customer(c1);


        Thread t1=new Thread(p);
        Thread tt1=new Thread(p);
        Thread tt2=new Thread(p);
        Thread tt3=new Thread(p);
        Thread tt21=new Thread(p);
        Thread tt31=new Thread(p);
        Thread t2=new Thread(c);

        t1.setName("我是生产者1");
        t1.setName("我是生产者2");
        tt2.setName("我是生产者3");
        tt3.setName("我是生产者4");
        tt21.setName("我是生产者31");
        tt31.setName("我是生产者41");
        t2.setName("我是消费者");
        t1.start();
        t2.start();
        tt1.start();
        tt2.start();
        tt3.start();
        tt21.start();
        tt31.start();



    }
}

这是简单案例做分享

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值