Java多執行緒 4 執行緒間通訊

2021-07-05 13:03:40 字數 1950 閱讀 1376

有這麼幾個方法,它們就定義在大家都非常熟悉的object類中,但是大家卻從來沒有呼叫過,並且也不知道是做什麼的,今天就由我帶著你們熟悉一下下面的這三個方法。它們都是定義在object類中的final方法,並且只能在synchronized上下文中呼叫。

如果你現在還不明白,沒關係,下面我會用乙個「生產者與消費者」的場景來說明。首先,我會以不正確的方式來實現生產者與消費者。出現問題後,我再用wait()方法和notify() 方法來解決問題,相信大家一看就會明白。

生產者與消費者是乙個經典的佇列問題:生產者生產只有在所有產品都消費完了以後才進行生產,消費者只有在有產品的情況下才能消費,通俗來講就是,生產乙個,消費乙個,再生產乙個,再消費乙個。。。。。。不能連續生產或連續消費。

該例子包含4個類,queue是佇列,放置生產者生產的產品,producer和consumer分別是生產者類和消費者類,program類是包含main方法的類。

首先是queue類,該類包含get()和put()這兩個同步方法

public

class queue

synchronized void put(int n)

}

接下來分別是producer類和consumer類,這兩個類都實現了runnable介面並覆寫了run()方法。

public

class

producer

implements

runnable

@override

public

void

run()

}}

public

class

consumer

implements

runnable

@override

public

void

run()

}}

下面是main()方法

public

class program

}

儘管queue類中的get()和put()方法都是同步的,但是並不能阻止生產者連續生產,也不能阻止消費者連續消費,這就導致輸出的結果是錯誤的

put

:0put

:1put

:2put

:3got

:3got

:3got

:3got

:3got

:3put

:4

接下來我們使用wait()方法和notify()方法來改造queue類,**如下

public

class queue catch (interruptedexception e)

}system.out.println("got:" + n);

valueset = false;

notify();

return n;

}synchronized void put(int n) catch (interruptedexception e)

}this.n = n;

valueset = true;

system.out.println("put:" + n);

notify();

}}

改造後的佇列的get()方法能夠防止連續消費,put()方法能夠防止連續生產,執行程式後的輸出如下:

put

:0got

:0put

:1got

:1put

:2got

:2put

:3got

:3put

:4got

:4

大家可以好好體會一下wait()和notify()方法,以及生產者和消費者

Java多執行緒 執行緒間通訊

一,等待 通知機制 實現執行緒間的通訊 舉個例子 我們去飯店就餐,飯店上餐的時間不確定,如果我們一直去詢問前台,是不是很煩,我麼這時就處於等待 wait 狀態,但是 飯店肯定會有人肯定會通知 notify 那個桌的菜已經做好了,前台就會通知這桌的人,菜來了。1,主要的方法wait notify 這個...

多執行緒 4執行緒間的通訊

wait和notify方法 簡單的生產者消費者 面試點1.wait和notify方法 當乙個物件呼叫了wait方法那麼它將阻塞當前執行緒,直到有另外乙個執行緒呼叫了當前物件的notify方法,被阻塞的執行緒才可能被喚醒。注意 若要呼叫這兩個方法必須先獲得物件的鎖,不讓會丟擲異常 public sta...

JAVA 多執行緒 執行緒間的通訊

程式設計間通訊 其實就是多個執行緒在操作同乙個資源 但是操作的動作不同 wait notify notifyall 都使用在同步中,因為要對持有的監視器 鎖 的執行緒操作 所以要使用在同步中,因為只有同步才具有鎖 將這些操作執行緒的方法定義在object類中的原因是因為這些方法在操作同步執行緒時,都...