執行緒間通訊

2021-10-03 06:35:34 字數 2248 閱讀 9743

作用:減少cpu資源浪費等待用時實現多個執行緒間的通訊

作用範圍:用於同步塊與同步方法中

屬於object類

wait()

使執行緒停止執行,由running進入blocked狀態

立即釋放物件鎖

wait()狀態遇到interrupt會拋異常

wait(long)當指定時間不被喚醒時自動喚醒,類似sleep()

notify()

是停止的執行緒繼續執行,由blocked進入runnable狀態

等到同步方法或同步塊執行完畢才釋放鎖,不會自動釋放

每次隨機通知乙個執行緒,獲取鎖

notifyall()

通知所有wait該物件的執行緒

子主題 注意等待條件發生變化造成的程式邏輯混亂

通知的協調性,過早會使當前執行緒一直阻塞

三種釋放鎖的的實驗

程式執行完同步方法釋放

程式在執行同步方法中遇到異常釋放

執行wait()方法後

每個鎖物件都有兩個佇列,乙個是阻塞佇列,乙個是就緒佇列

sleep導致當前執行緒休眠,與wait方法不同的是sleep不會釋放當前占有的鎖,sleep(long)會導致執行緒進入timed-wating狀態,而wait()方法會導致當前執行緒進入wating狀態

yield會使當前執行緒讓出cpu執行時間片,與其他執行緒一起重新競爭cpu時間片。一般情況下,優先順序高的執行緒有更大的可能性成功競爭得到cpu時間片,但這又不是絕對的,有的作業系統對執行緒優先順序並不敏感。

join等待其他執行緒終止join() 方法,等待其他執行緒終止,在當前執行緒中呼叫乙個執行緒的join() 方法,則當前執行緒轉為阻塞狀態,回到另乙個執行緒結束,當前執行緒再由阻塞狀態變為就緒狀態,等待cpu 的寵幸。

為什麼要用join()方法?

很多情況下,主線程生成並啟動了子執行緒,需要用到子執行緒返回的結果,也就是需要主線程需要在子執行緒結束後再結束,這時候就要用到join() 方法。

system.out.println(thread.currentthread().getname() + "執行緒執行開始!");

thread6 thread1 = new thread6();

thread1.setname("執行緒b");

thread1.join();

system.out.println("這時thread1執行完畢之後才能執行主線程");

巧妙地利用了時間片輪轉的方式, cpu給每個任務都服務一定的時間,然後把當前任務的狀態儲存下來,在載入下一任務的狀態後,繼續服務下一任務,任務的狀態儲存及再載入, 這段過程就叫做上下文切換。時間片輪轉的方式使多個任務在同一顆cpu上執行變成了可能。

(有時候也稱做任務)是指乙個程式執行的例項。在linux系統中,執行緒就是能並行執行並且與他們的父程序(建立他們的程序)共享同一位址空間(一段記憶體區域)和其他資源的輕量級的程序。

是指某一時間點cpu 暫存器和程式計數器的內容。

是cpu 內部的數量較少但是速度很快的記憶體(與之對應的是cpu 外部相對較慢的ram 主記憶體)。暫存器通過對常用值(通常是運算的中間值)的快速訪問來提高計算機程式執行的速度。

是乙個專用的暫存器,用於表明指令序列中cpu 正在執行的位置,存的值為正在執行的指令的位置或者下乙個將要被執行的指令的位置,具體依賴於特定的系統。

上下文切換可以認為是核心(作業系統的核心)在cpu 上對於程序(包括執行緒)進行切換,上下文切換過程中的資訊是儲存在程序控制塊(pcb, process control block)中的。pcb還經常被稱作「切換楨」(switchframe)。資訊會一直儲存到cpu的記憶體中,直到他們被再次使用。

1.掛起乙個程序,將這個程序在cpu 中的狀態(上下文)儲存於記憶體中的某處。

2.在記憶體中檢索下乙個程序的上下文並將其在cpu 的暫存器中恢復。

3.跳轉到程式計數器所指向的位置(即跳轉到程序被中斷時的**行),以恢復該程序在程式中。

1.當前執行任務的時間片用完之後,系統cpu正常排程下乙個任務;

2.當前執行任務碰到io阻塞,排程器將此任務掛起,繼續下一任務;

3.多個任務搶占鎖資源,當前任務沒有搶到鎖資源,被排程器掛起,繼續下一任務;

4.使用者**掛起當前任務,讓出cpu時間;

5.硬體中斷;

執行緒間通訊

執行緒間通訊 多個執行緒在操作統一資源,但各個執行緒操作的動作不同。資源 class res class input implements runnable public void run else x x 1 2 class output implements runnable public vo...

執行緒間通訊

執行緒間的通訊 在乙個多執行緒的應用程式中,所有執行緒共享程序資源,協同工作。所以,執行緒之間的通訊是編寫多執行緒 應用的必不可少的環節。執行緒之間的通訊包括互斥 同步等,它是多 執行緒設計中最難控制的部分,也是關鍵部分。執行緒間的互斥 1 臨界區 在乙個多執行緒 的應用程式中,可能存在這樣的危險 ...

執行緒間通訊

執行緒間通訊 其實就是多個執行緒在操作同乙個資源 但是操作的動作不同。等待喚醒機制 wait notify 0 notifyall 都使用在同步中,因為要對持有監視器 鎖 的執行緒操作。所以要使用在同步中,因為只有同步才具有鎖 為什麼這些操作執行緒的方法要定義object類中呢?因為這些方法在操作同...