執行緒通訊基礎(面向廁所程式設計)
技術標籤:java核心程式設計java多執行緒thread併發程式設計sync
一、sleep與wait的區別
先舉例,在理論
公廁(公廁的坑位是共享資源)中無論多少人(人是執行緒)排隊,只要你鎖好廁門(synchronized)就不會出現執行緒安全問題,無論排隊的多麼著急都要一個個來,鎖門期間(同步程式碼塊內/同步方法內)呼叫sleep相當於你蹲坑期間睡著了,那麼門鎖(同步鎖)肯定不會自動開啟,依然是鎖著的,除非時間到了你睡醒瞭然後該幹嘛幹嘛,否則只能通過粗暴的方式先把你叫醒(interreput方法)再說。wait相當於你禮讓他人,先主動開啟門鎖(wait呼叫後連釋放同步鎖)讓出坑位給別人,然後主動去加入排隊蹲坑的大部隊邊睡覺(程序陷入阻塞態)邊等待。
二 、notify和notifyAll()
如果有人上完廁所,出來後看到睡眠中的排隊者們,可以通過只叫醒一個(notify),但叫醒的一定是憋的最著急的人(優先順序最高的執行緒),被叫醒的人能立刻獲得坑位資源,也可以選擇一次性喚醒所有(notifyAll)排隊者,這時排隊者會一窩蜂湧入爭強坑位,可無論多麼激烈,只能有一個人搶佔坑位,優先順序越高的執行緒搶到茅坑資源的概率越大
sleep和wait都是用來進行執行緒控制,都可以使執行緒阻塞
1 sleep(milliseconds)可以用時間指定來使他自動醒過來,如果時間不到你只能呼叫interreput()來強行打斷;wait()可以用notify()/notifyAll()直接喚起.
3. sleep()是讓某個執行緒暫停執行一段時間,其控制範圍是由當前執行緒決定,wait()是由某個確定的物件來呼叫的。
sleep和wait的區別有:
1、這兩個方法來自不同的類分別是Thread和Object
2、最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他執行緒可以使用同步控制塊或者方法。
4、sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常
經典案例,交替列印0~9
public class Accounter implements Runnable{
private int index;
@Override
public void run() {
String name = Thread.currentThread().getName();
synchronized (this){
while (index < 10){
notify();
System.out.println(name + "列印:" + index);
index++;
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
Accounter accounter = new Accounter();
Thread thread = new Thread(accounter);
Thread thread2 = new Thread(accounter);
thread.start();
thread2.start();
}
}
推薦學習:消費者生產者案例