優質作者名單
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
,否則返回false
arriveandawaitadvance()
:當前執行緒到達屏障並等待其他執行緒也到達,當所有執行緒都到達時,屏障會自動前進到下一階段,然後方法返回如果它是當前執行緒phaser
被終止,並且該方法將被丟擲illegalstateexception
awaitadvance(int phase)
:等到屏障前進到給定階段,如果當前階段大於或等於給定階段,則此方法將立即返回。 isterminated()
:檢查phaser
當已註冊的執行緒數減少到零且未註冊新執行緒時,是否已終止phaser
將被終止。 getphase()
:獲取當前屏障的階段號,每個屏障都有唯一的階段編號,初始階段編號為 0。 getregisteredparties()
:獲取當前註冊的執行緒數。 getarrivedparties()
:獲取已到達當前屏障的執行緒數。 getunarrivedparties()
:獲取尚未達到當前屏障的執行緒數,實際上是getregisteredparties()
跟getarrivedparties()
值之間的差異。 forcetermination()
: 強制終止phaser
,即使有執行緒尚未到達,這會導致所有等待arriveandawaitadvance()
或awaitadvance(int)
執行緒丟擲的方法illegalstateexception
onadvance(int phase, int registeredparties)
:這是乙個受保護的方法,可以在子類中重寫,以便在每個屏障階段推進時執行自定義操作。 bulkregister(int parties)
:一次註冊多個執行緒,這通常用於靜態已知的執行緒數,或者當多個任務由同一執行緒表示時。
J**A 併發基礎知識:移相器綜合分析! - Programmer Goode 移相器類的目的是允許併發程式設計中多個執行緒之間的執行同步,它具有以下優點:
更好的可伸縮性:移相器類比其他同步實用程式類(如 cyclicbarrier 和 countdownlatch)具有更好的可伸縮性,因為它支援更多參與者(即執行緒)同時同步。 自動登出和清理:當所有參與者都完成執行後,Phaser 會自動登出並釋放相關資源,有助於避免記憶體洩漏和資源浪費。 靈活的執行模式:Phaser 類提供了多種執行模式,如並行、序列和混合模式,這使得它在處理併發任務時更加靈活。 它也有很多缺點,比如:1.相位器類相比,移相器類的實現相對複雜,所以在某些場景下可能會引入額外的效能開銷,並且移位器類有一定的使用門檻,對併發程式設計和j**a併發API的使用有深入的了解, 這可能會增加學習成本。
跟著我,每天學習網際網絡程式設計技術——程式設計師古德結束!