线程经典案例---(生产者和消费者)

假设现在有这样的一个情况,生产者生产一个物品的同时要让消费者取走。

  生产者要将自己生产的一个产品交到一个公共的区域(商城,超市),让消费者去取走(购买)。
  所以这个时候我们要考虑到线程同步和线程重复取值的一个问题。
  (同步--> synchronized,重复取值--->设定一个标记值,当达到条件时执行,未满足条件时等待)
class Messager{ //定义一个 生产者和消费者的中间类 保持数据和取走数据
    private String name;
    private String note;
    private boolean flag = false;
    //flag --> flase   假设当fasle的时候,只可以生产,不可以取走
    //flag --> true    假设当true的时候 ,消费者能取走,生产者不能生产
    public synchronized void set(String name,String note){//生产者生产数据
            if(this.flag == true){
                try {
                    super.wait();           //生产者不能生产数据,线程等待
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            this.name = name;
            //假设生产花费了一定的时间,产生了时间误差
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            this.note = note;
            this.flag = true;   //生产完毕,消费者可以取走数据
            super.notify();     //唤醒其他等待线程
    }
    public synchronized void get(){
        if(this.flag == false){
            try {
                // flase-->false  只可以生产,不可以取走,让当前线程等待
                super.wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        //假设取走花费了一定的时间
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("生产的名称:"+this.name+"生产的内容:"+this.note);
        this.flag = false;  //数据已经取走,改变当前标记
        super.notify();//唤醒其他等待线程
    }
}
class Producter implements Runnable{    //生产者生产数据
    private Messager msg;
    public Producter(Messager msg){
        this.msg = msg;
    }
    @Override
    public void run() {         //线程主体 假设A、B各生产五次
        for(int i=0; i<10;i++){
            if(i%2==0){
                msg.set("物品A", "物品A制作完毕。");
            }else{
                msg.set("物品B","物品B制作完毕。");
            }
        }
    }
}
class Consumer implements Runnable{
    private Messager msg;
    public Consumer(Messager msg){
        this.msg = msg;
    }
    @Override
    public void run() {         //线程主体  将生产的十个产品取出
        for (int x=0 ;x<10; x++){
            msg.get();
        }
    }
}

public class Test{
    public static void main(String args[]){
        Messager msg = new Messager();      //定义一个公共存放取出区域
        new Thread(new Producter(msg)).start();     //启动生产线程
        new Thread(new Consumer(msg)).start();      //启动消费线程
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值