Java 併發基礎知識 Phaser 全面分析!

Mondo 科技 更新 2024-02-03

優質作者名單

J**A 併發基礎知識:移相器綜合分析! - Programmer Goode Phaser 是 J**a 中一款靈活的同步工具,它的優點是支援多階段任務拆分和同步,並且可以動態註冊和登出參與者,它提供了豐富的等待和推送機制,讓開發者可以更細粒度的方式控制線程的協調行為,實現複雜的並行任務處理, 相較於其他同步工具,Phaser更加靈活易擴充套件,適用於多種併發場景。

在 j**a 中,phaser是乙個靈活的同步實用程式類,允許多個執行緒在乙個或多個障礙點上進行協調phaser想想乙個多執行緒聚會組織者,他負責確保所有涉及的執行緒都已達到某個階段,然後再一起進行下一步。

我們以乙個現實生活中的場景為例:假設你正在開發乙個多人遊戲,例如,乙個團隊益智遊戲,其中幾個玩家(執行緒)需要合作完成一系列任務才能完成關卡,每個任務分為幾個階段,每個階段需要所有玩家一起完成某些動作,然後才能進入下一階段。

在這個場景中,phaser可以發揮它的作用,每個階段都可以看作是乙個障礙點,每個玩家執行緒在當前階段完成自己的任務後都會去找它phaser報告,然後在所有玩家完成當前階段的任務後等待其他玩家完成phaser它會像鈴鐺一樣響起,通知所有玩家他們已準備好進入下一階段。

例如,在益智遊戲中,四名玩家需要找到四條不同的線索並將它們組合起來,以開啟通往下一關的大門phaser我自己完成了這項工作,phaser等待所有四名玩家找到線索,然後通知他們可以結合線索開啟通往下一關的大門。

Phaser主要用於解決多執行緒分階段一起完成任務的同步問題,它可以保證一組執行緒在到達某個障礙點(phase)之前是同步的,即所有執行緒都完成了某個階段的任務,才能一起進入下一階段,這種同步機制特別適用於需要多執行緒協同完成複雜任務的情況, 如多人遊戲、分布式系統、平行計算等場景。

當乙個執行緒完成乙個任務並到達障礙點時,它會呼叫移相器的相應方法通知其他執行緒,然後等待其他執行緒一起進入下一階段,在這個過程中,移相器會管理執行緒的同步和配合,確保所有執行緒都能按預定的順序完成任務。

此外,Phaser 還提供了靈活的執行緒註冊和登出功能,可以動態新增或刪除參與同步的執行緒,還支援中斷和超時機制,可以在等待其他執行緒的同時中斷或設定超時,增強多執行緒同步的靈活性。

這是乙個簡單的 Ja 示例,演示了如何使用它phaser同步多個執行緒以確保它們分階段完成任務,如下所示

import j**a.util.concurrent.phaser; 

public class phaserexample catch (interruptedexception e)

再次到達障礙點並等待其他執行緒

phaser.arriveandawaitadvance();

system.out.println("執行緒" + threadnum + ":任務的第二階段完成。 ");

模擬第三階段的任務

try catch (interruptedexception e)

最後到達障礙點,所有執行緒完成時,移相器將自動進入終止狀態

phaser.arriveandawaitadvance();

system.out.println("執行緒" + threadnum + ":第三階段任務完成,移相器任務完成。 ");

.start();

等待所有執行緒完成任務

注意:在實踐中,您可能不希望主線程在這裡阻塞,而是要做其他事情

但出於演示目的,讓主線程等待所有工作執行緒完成

phaser.awaitadvance(phaser.getphase())

system.out.println("所有執行緒的第一階段任務完成。 ");

phaser.awaitadvance(phaser.getphase() 1);

system.out.println("所有執行緒任務的第二階段已完成。 ");

phaser.awaitadvance(phaser.getphase() 1);

system.out.println("所有執行緒的第三階段任務完成,整個任務完成。 ");

在上面,建立了乙個phaser例項最初註冊三個執行緒和主線程,每個執行緒執行三個階段的任務,每個階段的任務在它們之間傳遞phaser.arriveandawaitadvance()方法是同步的,並且每個執行緒在完成當前階段的任務後,會阻止此方法,直到所有其他執行緒也完成了當前階段的任務,在所有執行緒都完成了上一階段的任務之後phaser它將自動進入終止狀態,並且不會再有執行緒被阻塞。

上述**輸出如下:

主線程也已準備就緒,等待其他執行緒。  

執行緒 x 已準備就緒,正在等待其他執行緒。

執行緒 y 已準備就緒,正在等待其他執行緒。

執行緒 Z 已準備就緒,正在等待其他執行緒。

在這裡,所有執行緒和主線程都等待,直到所有參與者都呼叫了 arriveandawaitadvance)。

主線程任務的第一階段完成(實際上,主線程可能只是監視或協調其他執行緒)。

執行緒 x 任務的第一階段完成。

執行緒 y 任務的第一階段完成。

執行緒 z 任務的第一階段完成。

所有執行緒和主線程繼續執行,直到它們再次呼叫 arriveandawaitadvance)。

主線程完成第二階段任務(實際上,它可能正在等待其他執行緒完成某個任務)。

執行緒 x 任務的第二階段完成。

執行緒 y 任務的第二階段完成。

執行緒 z 任務的第二階段已完成。

所有執行緒和主線程繼續執行第三階段任務)。

主線程任務的第三階段已完成(實際上可能是一些清理或結果的彙總)。

執行緒 x 的第三階段完成,移位器任務結束。

執行緒 y 的第三階段完成,移相器任務完成。

執行緒 Z 的第三階段完成,移相器任務完成。

phaser它允許一組執行緒相互等待,直到所有執行緒到達某個障礙點phaser非常適合多階段任務拆分和同步,如下所示phaser一些重要方法的簡要說明:

phaser(int parties):建構函式,建立乙個新的建構函式phaser例項,並設定註冊方的數量,這表示在進入下一階段之前必須到達屏障的執行緒數。 phaser():建構函式,建立乙個新的建構函式phaser例項,但不設定註冊的執行緒數,這通常用於層次結構phaser,其中phaser將繼承父親phaser已註冊的執行緒數。 register():增加到達屏障所需的執行緒數,如果呼叫此方法的執行緒尚未註冊,它也會將自身註冊為尚未到達的執行緒。 arrive():表示當前執行緒已經到達了屏障,並減少了未到達的執行緒數量,如果這是最後乙個到達的執行緒,並且已經設定了下一階段的屏障,那麼該方法將返回true,否則返回falsearriveandawaitadvance():當前執行緒到達屏障並等待其他執行緒也到達,當所有執行緒都到達時,屏障會自動前進到下一階段,然後方法返回如果它是當前執行緒phaser被終止,並且該方法將被丟擲illegalstateexceptionawaitadvance(int phase):等到屏障前進到給定階段,如果當前階段大於或等於給定階段,則此方法將立即返回。 isterminated():檢查phaser當已註冊的執行緒數減少到零且未註冊新執行緒時,是否已終止phaser將被終止。 getphase():獲取當前屏障的階段號,每個屏障都有唯一的階段編號,初始階段編號為 0。 getregisteredparties():獲取當前註冊的執行緒數。 getarrivedparties():獲取已到達當前屏障的執行緒數。 getunarrivedparties():獲取尚未達到當前屏障的執行緒數,實際上是getregisteredparties()getarrivedparties()值之間的差異。 forcetermination(): 強制終止phaser,即使有執行緒尚未到達,這會導致所有等待arriveandawaitadvance()awaitadvance(int)執行緒丟擲的方法illegalstateexceptiononadvance(int phase, int registeredparties):這是乙個受保護的方法,可以在子類中重寫,以便在每個屏障階段推進時執行自定義操作。 bulkregister(int parties):一次註冊多個執行緒,這通常用於靜態已知的執行緒數,或者當多個任務由同一執行緒表示時。

J**A 併發基礎知識:移相器綜合分析! - Programmer Goode 移相器類的目的是允許併發程式設計中多個執行緒之間的執行同步,它具有以下優點:

更好的可伸縮性:移相器類比其他同步實用程式類(如 cyclicbarrier 和 countdownlatch)具有更好的可伸縮性,因為它支援更多參與者(即執行緒)同時同步。 自動登出和清理:當所有參與者都完成執行後,Phaser 會自動登出並釋放相關資源,有助於避免記憶體洩漏和資源浪費。 靈活的執行模式:Phaser 類提供了多種執行模式,如並行、序列和混合模式,這使得它在處理併發任務時更加靈活。 它也有很多缺點,比如:1.相位器類相比,移相器類的實現相對複雜,所以在某些場景下可能會引入額外的效能開銷,並且移位器類有一定的使用門檻,對併發程式設計和j**a併發API的使用有深入的了解, 這可能會增加學習成本。

跟著我,每天學習網際網絡程式設計技術——程式設計師古德結束!

相關問題答案

    Java 併發同步原理高階

    故事人物。老王 JVM Xiao Nan 執行緒.小女孩 執行緒。房間 物件。在房間的門上 防盜鎖 顯示器重量級鎖。房間上門 小楠書包 輕量鎖。在房間的門上 刻有小南的名字 偏置鎖 該物體是執行緒獨有的。批量重新寫入 一類偏置鎖撤銷達到 閾值 批量重新偏置。無法雕刻名稱 批量撤銷對此類物件的偏差鎖定...

    全棧程式設計師基礎知識 Java 和 C 之間的語法差異

    J A 和 C 是兩種流行的程式語言,它們在設計理念和語法特性上有許多相似之處,但也有一些關鍵區別。本文將對兩種語言之間的語法差異進行詳細分析。型別系統。J A 和 C 都具有強型別系統,這意味著變數和資料必須具有明確定義的型別。但是,在 C 語言中,型別系統更加靈活,因為它支援泛型和可為 null...

    Java Language Basics synchronized 關鍵字

    一 引言。j a 中的 synchronized 關鍵字是 j a 併發程式設計中非常重要的部分。它提供對共享資源的互斥訪問,確保在任何給定時間只有乙個執行緒可以訪問共享資源。第二,基本概念。互斥鎖 當多個執行緒嘗試同時訪問共享資源時,請務必確保一次只有乙個執行緒可以訪問它,以避免資料不一致和其他併...

    從頭開始學習 Java 容易嗎?

    從頭開始學習 J A 容易嗎?隨著 J A 語言的普及和廣泛使用,越來越多的人對學習 J A 產生了興趣。然而,對於一些基礎為零的人來說,學習J A是否容易學習是乙個常見的問題。本文將通過學習難度 學習方法和對初學者的建議,幫助您開始 J A 程式設計。首先,讓我們看一下 J a 語言的特性。J A...

    這就是您應該如何開始使用 Java 0 基礎知識

    J A 是一種流行的程式語言,廣泛應用於軟體開發 大資料處理 移動應用程式開發等領域。對於初學者來說,上手J A並不容易,因為J A語言的知識點很多,有一定的難度。但是,只要我們掌握了正確的學習習方法,我們就能夠輕鬆上手J A。很多初學者剛開始學習 J A的時候,總想把所有的知識點都學完,從根源上明...