多執行緒間通訊,其實就是多個執行緒操操作同乙個資源,但是操作方式不同。典型例項有生產者和消費者,本文也通過例項來分析執行緒等待喚醒機制。
public final void notify()
喚醒在此物件監視器上等待的單個執行緒,如果所有執行緒都在此物件上等待,則會任意選擇喚醒其中乙個執行緒。
public final void wait()
當前執行緒必須擁有此物件監視器。該執行緒發布對此監視器的所有權並等待,直到其他執行緒通過呼叫 notify 方法,或 notifyall 方法通知在此物件的監視器上等待的執行緒醒來。然後該執行緒將等到重新獲得對監視器的所有權後才能繼續執行。
「為了實現監視器的排他性監視能力,jvm為每乙個物件和類都關聯乙個鎖;鎖住了乙個物件,就是獲得物件相關聯的監視器」。
wait(),notify(),notifyall(),這些方法都使用在同步**塊中,因為要對持有監視器的執行緒進行操作,所以要使用在同步中,因為只有同步才有鎖。值得說明的是:等待和喚醒必須是同乙個鎖(必須為同乙個物件)。由於鎖可以是任意物件,所以可以被任意物件呼叫的方法定義在object類中。
倉庫類
//等待和喚醒都是this鎖
public
class storage
public
intgetstoragesize()
public synchronized t pop() catch (exception ex)
}top--;
t t = (t) data[top];
//喚醒所有執行緒
notifyall();
return t;
}public synchronized void
push(t t) catch (exception ex)
}data[top++] = t;
notifyall();
}}
生產者
public
class
producer
implements
runnable
@override
public
void
run()
try catch (exception ex)
storage.push("data:" + index);
system.out.println("producer data:" + index);
index++;}}
public
void
destroy()
}
消費者
public
class
consumer
implements
runnable
@override
public
void
run()
try catch (exception ex)
system.out.println(thread.currentthread().getname() + "consumer:" + storage.pop());}}
public
void
destroy()
}
lock 實現提供了比使用 synchronized 方法和語句可獲得的更廣泛的鎖定操作。此實現允許更靈活的結構,可以具有差別很大的屬性,可以支援多個相關的 condition 物件。
public
class storage
public
intgetstoragesize()
public t pop() throws interruptedexception
top--;
t = (t) data[top];
//喚醒生產者
producercon.signal();
} finally
return t;
}public
void
push(t t) throws interruptedexception
data[top++] = t;
//喚醒消費者
consumercon.signal();
} finally
}}
Java 多執行緒間的通訊 等待喚醒
有兩個執行緒 乙個給名字和性別賦值 input 乙個輸出名字和性別 output 但會一下輸出很多同樣的名字和性別 cpu沒切走 用等待喚醒機制 就可以 1 賦值乙個 然後input wait 喚醒output 2 輸出乙個 output wait 再喚醒input這樣可以賦值乙個 就輸出乙個等待 ...
java 多執行緒 等待喚醒機制
package thread執行緒 生產者消費者問題 問題1 為什麼要用while而不用if進行判斷 因為是多執行緒在操作同一資源,即有多個生產者也有多個消費者,如果用if進行判斷的話會出現生產者生產連續生產多次,而消費者只消費 消費一次,或生產者生產一次消費者消費多次的錯誤資訊,這是為什麼呢?原因...
java多執行緒等待喚醒機制
等待喚醒機制 object類中提供了三個方法 wait 等待 notify 喚醒單個執行緒 notifyall 喚醒所有執行緒 為什麼這些方法不定義在thread類而定義在object類中呢?這些方法的呼叫必須通過鎖物件呼叫,而我們使用的鎖物件是任意鎖物件。所以,這些方法必須定義在object類中。...