2017-05-09 93 views
1

我沒有在multithreading工作過,加入和等待,通知方法有什麼區別?是否僅限於獲得lock的差異,並避免其他threads訪問它或者是否存在其他用例?多線程加入和等待之間的區別,通知

爲什麼我應該去爲multithreadingwaitnotifyjoin可用於thread執行完畢?

如果有實時的例子已經提供

+0

[等待(長時間超時)和連接(長時間毫秒)之間的區別?](http://stackoverflow.com/questions/8818721/difference-between-waitlong-timeout-and-joinlong-millis) – aUserHimself

回答

1

的join()方法等待線程死亡這將是有益的。 wait()和notify()用於線程間通信。換句話說,這些方法會阻塞線程,直到滿足某些條件。

3

方法join(的Thread類)等待線程死亡:

等待該線程死亡。

方法waitnotifynotifyAll不相關的一個線程的執行結束。

方法wait

造成當前線程等待,直到其他線程調用notify()方法或此對象的notifyAll的()方法。

https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait()

方法notifynotifyAll用來喚醒一個沉睡的線程:

喚醒在此對象監視器上等待的單個線程。


wait的與notify的一個常見用途是訪問共享資源。 當資源不可用時,消費者在顯示器上等待。 當生產者創建資源時,它通知(或notifyAll)喚醒等待該資源的線程(或多個線程)。

連接的常見用法是阻止主線程,直到配置線程完成其活動,然後再繼續。

1

join():等待此線程死亡。

join方法允許一個線程等待另一個線程的完成。如果T是一個Thread對象,它的線程當前執行,

t.join(); 

導致當前線程,直到T的線程終止暫停執行。

wait():導致當前線程等待,直到另一個線程調用此對象的notify()方法或notifyAll()方法。

notify():喚醒正在等待該對象監視器的單個線程。如果任何線程正在等待這個對象,則選擇其中一個線程來喚醒。

notifyAll():喚醒在該對象監視器上等待的所有線程。線程通過調用其中一個等待方法來等待對象的監視器。

請參閱下面的帖子瞭解更多詳情。

Difference between wait() and sleep()

Difference between Synchronized block with wait/notify and without them?

例子:

A simple scenario using wait() and notify() in java

work-with-wait-notify-and-notifyall

0

此實現使用空調上this.wait呼叫的環this.isAlive。由於線程終止this.notifyAll方法調用了 。建議應用程序不要在Thread實例上使用wait,notify或者notifyAll。

等待Thread終止(和清理)的正確方法是join()

的文檔建議您使用wait()notify()notifyAll()Thread實例。

恕我直言,這是一個錯誤的增加一個顯示器java.lang.Object。這與大多數類完全無關,膨脹實現並導致不適當的使用。

聲明方法​​的能力也是一個錯誤。它傾向於延長關鍵部分,並且如果確實需要(不是這樣),則可以將其限制在某些類別(或將其實現爲接口的類別),而不是膨脹類別層次結構。