1. 程式人生 > >關於線程之間的通信和同步

關於線程之間的通信和同步

修改 tar trac 吃貨 pre start bubuko count err


/*
資源類
*/
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();

}
}
執行結果

技術分享圖片

關於線程之間的通信和同步