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