執行緒間的協作同步

2021-07-24 23:06:07 字數 1855 閱讀 3826

(幫朋友看時候學了一下這方面知識 ,有錯誤請糾正)

wait() 、notify() 和notifyall()

condition:在condition物件中,與wait,notify和notifyall方法對應的分別是await,signal,signalall。但是,condition對object進行了擴充套件,因而它也包含wait和notify方法。

thread.currentthread().getname()作用,獲取執行緒的名字,我沒有看源**只是通過自己測試得到的理解,我們通過這個方法可以得到執行緒的名字格式thread-0、thread-1、thread-2…………….這後面的數字id標識怎麼來的呢,是根據我們自定義執行緒類的初始化順序來定的。

object.notifyall()喚醒所有阻塞的執行緒,並且測試中的執行順序沒有按照thread.start的順序輸出,而是按照例項化thread的順序輸出的阻塞的執行緒。

object.notify() 喚醒某乙個阻塞執行緒,測試中是喚醒的是第乙個呼叫start()方法的執行緒

通過呼叫thread類的start()方法來啟動乙個執行緒,這時此執行緒是處於就緒狀態,並沒有執行。然後通過此thread類呼叫方法run()來完成其執行操作的,這裡方法run()稱為執行緒體,它包含了要執行的這個執行緒的內容,run方法執行結束,此執行緒終止。

搜資料所得:notifyall,雖然是對每個wait的物件都呼叫一次notify,但是這個還是有順序的,每個物件都儲存這乙個等待物件鏈,呼叫的順序就是這個鏈的順序。其實啟動等待物件鏈中各個執行緒的也是乙個執行緒,在具體應用的時候,需要注意一下。

package cn.neuq;

public class

test catch (interruptedexception e)

/***

* thread2執行緒啟動,由於thread2類中run()方法呼叫了notify

* 呼叫某個物件的notify()方法能夠喚醒乙個正在等待這個物件的monitor的執行緒

* 如果有多個執行緒都在等待這個物件的monitor,則只能喚醒其中乙個執行緒

* 此時thread2繼續執行完成run()方法釋放鎖

* 然後執行喚醒的thread1,接著wait()**之後繼續執行

* * */

thread2.start();

}static class

thread1

extends

thread catch (interruptedexception e)

system.out.println("thread1執行緒"+thread.currentthread().getname()+"獲取到了鎖");}}

}static class

thread2

extends

thread

system.out.println("thread2執行緒"+thread.currentthread().getname()+"釋放了鎖");}}

static class

thread3

extends

thread catch (interruptedexception e)

system.out.println("thread3執行緒"+thread.currentthread().getname()+"獲取到了鎖");}}

}static class

thread4

extends

thread catch (interruptedexception e)

system.out.println("thread4執行緒"+thread.currentthread().getname()+"獲取到了鎖");}}

}}

詳述執行緒間協作

例如 synchronized關鍵字只是起到了多個執行緒 序列 執行臨界區中 的作用,但是哪個執行緒先執行,哪個執行緒後執行依無法確定,object類中的wait notify 和notifyall 三個方法解決了執行緒間的協作問題,通過這三個方法的 合理 使用可以確定多執行緒中線程的先後執行順序 ...

執行緒 同步執行緒和協作執行緒

1 同步塊 實現 package edu.xalead public class 吃包子 extends thread public synchronized void eat public void run catch interruptedexception e 多執行緒的爭用問題 會出現兩個執...

執行緒間的共享和協作

執行緒間的協作 synchroniezd 可以修飾方法或者以同步塊的方式使用。它可以確保多個執行緒在同一時刻,只能有乙個執行緒處於方法或者同步 塊中,保證了執行緒對於變數的訪問的可見性與排他性,又稱之為內鎖機制。物件鎖和類鎖 物件鎖是用於物件例項方法,或者乙個物件例項上的,類鎖是用於類的靜態方法或者...