java多執行緒通訊之等待喚醒機制

2021-07-28 11:42:24 字數 2234 閱讀 1622

多執行緒間通訊,其實就是多個執行緒操操作同乙個資源,但是操作方式不同。典型例項有生產者和消費者,本文也通過例項來分析執行緒等待喚醒機制。

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類中。...