簡體   English   中英

加入和等待之間的多線程區別,通知

[英]multiThreading difference between join and wait,notify

我沒有在multithreading工作過,join 和 wait,notify 方法有什么區別? 區別僅限於獲取lock並阻止其他threads訪問它還是有其他用例?

join可以用於完成thread執行時,為什么我要在multithreading waitnotify

如果提供任何實時示例會有所幫助

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

等待這個線程死亡。

waitnotifynotifyAll方法與一個線程的執行結束無關。

方法wait

使當前線程等待,直到另一個線程為此對象調用 notify() 方法或 notifyAll() 方法。

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

方法notifynotifyAll用於喚醒休眠線程:

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


waitnotify常見用途是訪問共享資源。 當資源不可用時,消費者在監視器上等待。 當生產者創建資源時,它會通知(或 notifyAll)喚醒等待此資源的線程(或多個線程)。

join 的一個常見用途是阻塞主線程,直到配置線程完成其活動,然后再繼續。

join( ):等待這個線程結束。

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

t.join();

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

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

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

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

有關更多詳細信息,請參閱以下帖子。

wait() 和 sleep() 的區別

帶等待/通知和不帶它們的同步塊之間的區別?

例子:

java中使用wait()和notify()的簡單場景

與等待通知和通知所有人一起工作

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM