_栖凤_ 2021-08-13 14:52 采纳率: 100%
浏览 24
已结题

多线程,案例生产者和消费者,对于里面的逻辑不清楚

//奶箱
package com.company;
public class Box {
    private int mike;
    private boolean state=false;//奶箱的状态   是否为满的
 
    public synchronized void put(int mike) {
        if (state) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.mike = mike;
        System.out.println("送奶员将第" + mike + "瓶奶放入奶箱中");
        state = true;
        notifyAll();
    }
 
    public synchronized void get() {
        if (!state) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("消费者获得第" + mike + "瓶奶");
        state = false;
        notifyAll();
    }
}
//生产者
package com.company;
 
public class Producer implements Runnable{
    private Box b;
    @Override
    public void run() {
        for(int i=1;i<=5;i++)
        {
            b.put(i);
        }
    }
 
    public Producer(Box b) {
        this.b = b;
    }
}
//消费者
package com.company;
 
public class Consunmer implements Runnable {
    private Box b;
    public Consunmer(Box b) {
        this.b = b;
    }
    @Override
    public void run() {
        while (true) {
            b.get();
        }
    }
}
//主函数
package com.company;
 
public class Main {
    public static void main(String[] args) {
        Box b = new Box();
        Consunmer consunmer = new Consunmer(b);
        Producer producer = new Producer(b);
        Thread t1 = new Thread(consunmer);
        Thread t2 = new Thread(producer);
        t1.start();
        t2.start();
    }
}

那个在Box类中的put和get方法如果剩下的放在else里面就结果不对,不懂那个逻辑,state为假的时候执行wait()后面的代码就不会执行了嘛,这样的话加个else也是一样的呀
img
不加else:

img

  • 写回答

1条回答 默认 最新

  • 纯白微风<alert> 2021-08-13 17:32
    关注

    if...else表示二选一,if...表示满足if条件就会执行if里面的代码,if外面的代码在if中没有退出的话也是会执行的;
    wait();执行完了不会退出,只是在等待唤醒(notifyAll();)如果被重新唤醒了就会继续执行方法中的代码,你把wait()当成成sleep()就好理解了(只是帮助理解,sleep不会释放锁)
    你如果把下面的代码放到else里面逻辑就改变了
    原本逻辑:准备将奶放到箱子了,如果(if)箱子满了,就等箱子没满的通知,收到箱子没满的通知,就将奶放到箱子里
    加上else的逻辑:准备将奶放到箱子了,如果(if)箱子满了,就等箱子没满的通知,收到箱子没满的通知,否则(else)就将奶放到箱子里

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月22日
  • 已采纳回答 8月15日
  • 创建了问题 8月13日

悬赏问题

  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan