java单生产者单消费者模式复习

最近在学习java多线程部分,以前也有看过一段时间,有段时间不看就又模糊了,今天总结一下多线程中单生产者与消费者的问题,也方便以后复习,本文主要是记录这种模式的代码流程。

首先我们有三个主要类,盐水鸭类 Yanshuiya.java,生产盐水鸭的生产者类Producer.java,消费盐水鸭的消费者类Consumer.java

首先我们看最主要的盐水鸭类:
1.盐水鸭类需要一个生产计数count,代表生产了多少只鸭子
2.还需要一个flag标记用于判断鸭子店是否有鸭子,没有标记为false那我们需要生产鸭子了,有标记为true那就等卖掉在生产,假设我们的行为为生产一只就必须卖掉一只,小本生意防止亏损-_-||
3.盐水鸭中我们需要定义生产方法void shengchan()和消费方法void xiaofei()
下面是该类的源码
/**
 * Created by Cronous on 2018/5/15.
 */
public class Yanshuiya {

    int count = 0;
    boolean flag = false;//用于判断是否有南京盐水鸭
    synchronized void shengchan(){
        if(flag == false){
            count++;
            System.out.println("生产南京盐水鸭第" + count + "只");
            flag = true;
            notify();//唤醒消费者,因为消费者在等待
        }else{
            try {wait();} catch (InterruptedException e) {e.printStackTrace();}
        }
    }


    synchronized void xiaofei(){
        if(flag == true){
            System.out.println("消费南京盐水鸭第" + count + ".....只");
            flag = false;
            notify();//唤醒生产者,因为生产者在等待
        }else{
            try {wait();} catch (InterruptedException e) {e.printStackTrace();}
        }

    }

}
生产者类
1.该类首先需要实现Runnable接口
2.其次需要一个构造方法,该构造方法需要传入共享数据,在这里盐水鸭就相当于共享数据
/**
 * Created by Cronous on 2018/5/15.
 * 生产盐水鸭,生产者
 */
public class Producer implements Runnable{

    private Yanshuiya yanshuiya;
    public Producer(Yanshuiya yanshuiya){
        this.yanshuiya = yanshuiya;
    }
    @Override
    public void run() {
        //这里进行生产动作
        while(true){
            yanshuiya.shengchan();
        }
    }
}
消费者类与生产者类似这里就不做叙述
/**
 * Created by Cronous on 2018/5/15.
 * 消费盐水鸭,消费者
 */
public class Consumer implements Runnable{

    private Yanshuiya yanshuiya;
    public Consumer(Yanshuiya yanshuiya){
        this.yanshuiya = yanshuiya;
    }
    @Override
    public void run() {
        //这里进行消费动作
        while(true) {
            yanshuiya.xiaofei();
        }
    }
}
主函数
public class Main {

    public static void main(String[] args) {
        //创建一个盐水鸭初始对象
        Yanshuiya k = new Yanshuiya();
        //创建生产者和消费者线程
        Thread producer = new Thread(new Producer(k));
        Thread consumer = new Thread(new Consumer(k));
        producer.start();
        consumer.start();
    }
}
控制台结果
......
生产烤鸭第30757只
消费烤鸭第30757.....只
生产烤鸭第30758只
消费烤鸭第30758.....只
生产烤鸭第30759只
消费烤鸭第30759.....只
生产烤鸭第30760只
消费烤鸭第30760.....只
生产烤鸭第30761只
消费烤鸭第30761.....只
生产烤鸭第30762只
消费烤鸭第30762.....只
生产烤鸭第30763只
消费烤鸭第30763...........
多生产者多消费者请看我这篇文章:https://blog.csdn.net/cronousgt/article/details/78490795
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值