• java 生产者 与 消费者的案例


    主要理解了两个问题

       1.线程数据同步的问题

       2.线程交替运行的方式

    package ThreadDemo;

    /**
    * 生产者与消费者的案例(一,同步的问题,值的问题 二,交替执行的问题)
    * @author lile
    * 同步的问题(synchronized 知识点)
    * 交替执行的问题(notify ,wait, 线程等待)
    */
    public class ThreadDemo {
    public static void main(String[] args) {
    Food food = new Food();
    //生产者
    Producter p = new Producter(food);

    Consumer c = new Consumer(food);
    new Thread(p).start();
    new Thread(c).start();

    }
    }

    /**
    * 生产者的类
    * @author lile
    *
    */
    class Producter implements Runnable{
    private Food food;
    public Producter(Food food){
    this.food = food;
    }
    @Override
    public void run() {
    // TODO Auto-generated method stub


    for (int i = 0; i < 100; i++) {
    if(i%2==0){
    food.set("韭菜炒鸡蛋", "韭菜炒蛋");
    }else{
    food.set("腰花", "腰花");
    }
    }
    }


    }

    /**
    * 消费这的对象
    * @author lile
    *
    */
    class Consumer implements Runnable{

    private Food food;
    public Consumer(Food food){
    this.food = food;
    }

    @Override
    public void run() {
    // TODO Auto-generated method stub
    for (int i = 0; i <100; i++) {
    food.get();
    }

    }

    }

    /**
    * 产品对象
    * @author lile
    *
    */
    class Food{
    private Boolean flag = true; //true表示可以生产
    private String name;
    private String content;
    public Food(){

    }
    public Food(String name,String content){
    this.name = name;
    this.content = content;
    }

    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public String getContent() {
    return content;
    }
    public void setContent(String content) {
    this.content = content;
    }


    //制作产品
    public synchronized void set(String name,String content){
    //两个线程交替运行
    if(!flag){
    //当前线程等待,没有指定时间,需要其他线程唤醒,释放对象所,让出cpu,不能生产
    try {
    this.wait();
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }

    this.setName(name);
    try {
    Thread.sleep(300);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    this.setContent(content);
    this.flag = false; //表示可以消费
    this.notify(); //在监视器唤醒该线程
    }

    //消费
    public synchronized void get(){
    //两个线程交替运行
    if(flag){
    //当前线程等待,没有指定时间,需要其他线程唤醒,释放对象所,让出cpu,不能生产
    try {
    this.wait();
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    try {
    Thread.sleep(300);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    this.flag = true; //表示可以消费
    this.notify(); //在监视器唤醒该线程
    System.out.println(this.getName()+this.getContent());
    }

    }








  • 相关阅读:
    MVC学习
    Net开源网络爬虫
    js调用wcf 的SOA
    Redis 上实现的分布式锁
    dojo/request
    Python,PyCharm
    如何解决卸载McAfee时出现“处于托管模式时无法删除”问题(转)
    糗事⊙︿⊙
    Oracle exp,imp
    java 生产者消费者问题 并发问题的解决(转)
  • 原文地址:https://www.cnblogs.com/lilefordream/p/3700742.html
Copyright © 2020-2023  润新知