多個執行緒在處理同一資源,但是任務卻不同。
1,wait(): 讓執行緒處於凍結狀態,被wait的執行緒會被儲存到執行緒池中。
2,notify():喚醒執行緒池中乙個執行緒(任意).
3,notifyall():喚醒執行緒池中的所有執行緒。
這些方法都必須定義在同步中,因為這些方法是用於操作執行緒狀態的方法,必須要明確到底操作的是哪個鎖上的執行緒。
1,輸入乙個人名以及性別後,立即進行輸出
//資源
class resource
//輸入
class input implements runnable
public void run()
catch(interruptedexception e){}
if(x==0)
else
r.flag = true;
r.notify();
}x = (x+1)%2;
} }}//輸出
class output implements runnable
public void run()
catch(interruptedexception e){}
system.out.println(r.name+"....."+r.***);
r.flag = false;
r.notify();
}} }
}class resourcedemo2
}
執行結果
對上述**進行優化
class resource
catch(interruptedexception e){}
this.name = name;
this.*** = ***;
flag = true;
this.notify();
} public synchronized void out()
catch(interruptedexception e){}
system.out.println(name+"...+...."+***);
flag = false;
notify(); }}
//輸入
class input implements runnable
public void run()
else
x = (x+1)%2;
} }}//輸出
class output implements runnable
public void run() }
}class resourcedemo3
}
2,多生產者與多消費者(經典示例):2個執行緒生產商品,2個執行緒售賣商品。
class resource
catch(interruptedexception e){}//
this.name = name + count;//烤鴨1
count++;//2
system.out.println(thread.currentthread().getname()+"...生產者..."+this.name);//生產商品
flag = true;
notifyall();
} public synchronized void out()//
catch(interruptedexception e){} //t2
system.out.println(thread.currentthread().getname()+"...消費者........"+this.name);//消費商品
flag = false;
notifyall(); }}
class producer implements runnable
public void run() }
}class consumer implements runnable
public void run() }
}class producerconsumerdemo
}
執行結果:
分析:
1)選擇 while 判斷而不選擇if 判斷的原因:
if判斷標記,只判斷一次,如果被wait的執行緒被喚醒了,可能會導致不該執行的執行緒執行了,出現了資料錯誤的情況。而while判斷標記,解決了執行緒獲取執行權後,是否要執行!
2)notify:只能喚醒乙個執行緒,如果本方喚醒了本方,沒有意義。而且while判斷標記+notify會導致死鎖。
3)notifyall:喚醒全部執行緒,解決了本方執行緒一定會喚醒對方執行緒的問題。
4)while—notifyall notifyall方法喚醒了所有執行緒,不該被執行的執行緒也被喚醒,需要二次判斷,降低了**的效率。
()
144 多執行緒 執行緒間通訊 等待喚醒機制
class res class input implements runnable public void run catch exception e if x 0 else x x 1 2 r.flag true r.notify class output implements runnable ...
Java 多執行緒間的通訊 等待喚醒
有兩個執行緒 乙個給名字和性別賦值 input 乙個輸出名字和性別 output 但會一下輸出很多同樣的名字和性別 cpu沒切走 用等待喚醒機制 就可以 1 賦值乙個 然後input wait 喚醒output 2 輸出乙個 output wait 再喚醒input這樣可以賦值乙個 就輸出乙個等待 ...
多執行緒(五) 執行緒的通訊
例題 使用兩個執行緒列印1 100。執行緒1,執行緒2交替列印。執行緒通訊的例子 使用兩個執行緒列印1 100.執行緒1,執行緒2,交替列印。class number implements runnable catch interruptedexception e system.out.printl...