您的位置:首页 > 其它

自学线程之线程死锁与唤醒案例

2020-07-13 06:07 85 查看
package thead;

public class Box {
//定义一个成员变量,表示第x瓶奶
private int milk;
//定义一个成员变量,表示奶箱的状态
private boolean state=false;

//提供存储牛奶和获取牛奶的操作
public synchronized void put(int milk) {
//如果有牛奶,等待消费
if(state) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//如果没有牛奶生产牛奶
this.milk=milk;
System.out.println("送奶工将第"+this.milk+"瓶奶放入奶箱");
//生产完毕之后,修改奶箱状态
state=true;
//唤醒其他等待的线程
notifyAll();

}
public synchronized void get() {
//如果没有牛奶等待生产
if(!state) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//如果有牛奶就消费牛奶
System.out.println("用户拿到第"+this.milk+"瓶奶");
//消费完毕,修改奶箱状态
state =false;

//唤醒其他等待的线程
notifyAll();}
}

```bash

```bash
package thead;

public class Customer implements Runnable {
private Box b;
public Customer(Box b) {
this.b=b;

}
@Override
public void run() {
while(true) {
b.get();
}

}

}
package thead;

public class BoxDemo {

public static void main(String[] args) {
// TODO Auto-generated method stub
//创建奶箱对象,这里是共享数据区域
Box b=new Box();
//创建生产者对象作为构造方法参数传递,因为在这个类中要调用存储牛奶的操作
Producter p=new Producter(b);
Customer c=new Customer(b);
//创建两个线程对象,分别把生产者对象与消费者对象作为构造方法参数传递
Thread t1=new Thread(p);
Thread t2=new Thread(c);
t1.start();
t2.start();
}

}
`
package thead;

public class Producter implements Runnable {
private Box b;

public Producter(Box b) {
this.b = b;
}

public void run() {
for (int i = 1; i <= 30; i++) {
b.put(i);
}
}

}

来自黑马教程

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐