![](/img/trans.png)
[英]What is the difference between wait/notify and wait/interrupt?
[英]multiThreading difference between join and wait,notify
我沒有在multithreading
工作過,join 和 wait,notify 方法有什么區別? 區別僅限於獲取lock
並阻止其他threads
訪問它還是有其他用例?
當join
可以用於完成thread
執行時,為什么我要在multithreading
wait
和notify
?
如果提供任何實時示例會有所幫助
方法join
(類Thread
)等待一個線程死亡:
等待這個線程死亡。
wait
、 notify
、 notifyAll
方法與一個線程的執行結束無關。
方法wait
:
使當前線程等待,直到另一個線程為此對象調用 notify() 方法或 notifyAll() 方法。
https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait()
方法notify
和notifyAll
用於喚醒休眠線程:
喚醒在此對象的監視器上等待的單個線程。
wait
和notify
常見用途是訪問共享資源。 當資源不可用時,消費者在監視器上等待。 當生產者創建資源時,它會通知(或 notifyAll)喚醒等待此資源的線程(或多個線程)。
join 的一個常見用途是阻塞主線程,直到配置線程完成其活動,然后再繼續。
join(
):等待這個線程結束。
join方法允許一個線程等待另一個線程的完成。 如果 t 是其線程當前正在執行的 Thread 對象,
t.join();
導致當前線程暫停執行,直到 t 的線程終止。
wait()
:使當前線程等待,直到另一個線程為此對象調用 notify() 方法或 notifyAll() 方法。
notify()
:喚醒在此對象的監視器上等待的單個線程。 如果有任何線程正在等待該對象,則選擇其中一個線程被喚醒。
notifyAll()
:喚醒在此對象監視器上等待的所有線程。 線程通過調用等待方法之一在對象的監視器上等待。
有關更多詳細信息,請參閱以下帖子。
例子:
join() 方法等待一個線程死亡。 而 wait() 和 notify() 用於線程間通信。 換句話說,這些方法將阻塞線程,直到滿足某些條件。
假設我們有 2 個線程運行線程 1 和線程 2。
如果我們在 Thread-1 上應用 join,那么 Thread-2 想要等到 Thread-2 完成。
假設 Thread-1 包含數千行,但 Thread-2 想等到第 10 行完成。
如果我們使用 join 則 Thread-2 要等到 Thread-1 完成。 如果我們使用Wait 和Notify,則不需要等到Thread-1 完成,在Thread-1 的第10 行完成后,另一個線程可以恢復。
public class JoinDrawBack {
static int sum=0;
public static void main(String a[]) throws InterruptedException {
MyThread thread_1=new MyThread();
thread_1.start(); //starting thread_1
thread_1.join(); //applying join on Thread-1
System.out.println(sum); //thread-2 printing the sum
//here thread-2 wants to wait till completion of run method,
//when we use join then there is no need to wait such a long time.
}}class MyThread extends Thread{
public void run(){
for(int i=0;i<10;i++){
JoinDrawBack.sum=JoinDrawBack.sum+i;
}
///thousands of lines
}
}
此實現使用以 this.isAlive 為條件的 this.wait 調用循環。 當線程終止時,調用 this.notifyAll 方法。 建議應用程序不要在 Thread 實例上使用 wait、notify 或 notifyAll。
等待Thread
終止(和清理)的正確方法是join()
。
該文檔建議您不要在Thread
實例上使用wait()
、 notify()
或notifyAll()
。
恕我直言,將監視器添加到java.lang.Object
是錯誤的。 它與大多數類完全無關,膨脹實現並導致不當使用。
聲明方法synchronized
的能力也是一個錯誤。 它往往會延長關鍵部分,如果確實需要(不是),可以將其限制為某個類java.lang.Synchronizable
(或將其作為接口實現的類),而不是使類層次結構膨脹。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.