关于线程之间的通信和同步


/*
资源类
*/
class BaoZi {
String pi;
String xian;
boolean flag=false;
}
/*
同步线程保证2个线程只有有一个执行(互斥),锁对象必须保证唯一,可以使用资源对象作为锁对象
*/
class BaoZipu extends Thread{
private BaoZi bz;

public BaoZipu(BaoZi bz) {
this.bz = bz;
}
@Override
public void run() {
//定义一个变量
int count=0;
while (true){
synchronized (bz){
//对资源进行判断
if(bz.flag==true){

try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(count%2==0){
//生生产
bz.pi="薄皮";
bz.xian="猪肉";
}else{
bz.pi="薄皮";
bz.xian="牛肉";
}
count++;
System.out.println("包子铺生产包子"+bz.pi+bz.xian+"包子");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
bz.flag=true;
bz.notify();
System.out.println("包子铺已经生产好了"+bz.pi+bz.xian+"已经出锅了");
}
}
}
}
public class ChiHuo extends Thread {
//需要在成员位置创建一个变量
private BaoZi bz;
//带参构造给变量赋值
public ChiHuo(BaoZi bz){
this.bz=bz;
}
//设置线程任务
@Override
public void run() {
//使用死循环
while (true){
//必须同步保证线程只有一个执行
synchronized (bz){
//资源类进行判断
if (bz.flag==false){
//调用wait方法进入等待
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
} }
System.out.println("吃货正在吃包子"+bz.pi+bz.xian+"的包子");
//修改状态为false
bz.flag=false;
bz.notify();
System.out.println("吃货已经吃完了"+bz.pi+bz.xian+"可以开始生产了");

}
}
}
}
public class Demo {
//最后调用主方法
public static void main(String[] args) {
BaoZi bz=new BaoZi();
new BaoZipu(bz).start();
new ChiHuo(bz).start();

}
}
执行结果

猜你喜欢

转载自www.cnblogs.com/liyado/p/10618591.html