最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java多線程之Phaser的使用詳解

 更新時間:2020年03月31日 09:22:40   作者:flydean  
這篇文章主要介紹了java多線程之Phaser的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前面的文章中我們講到了CyclicBarrier、CountDownLatch的使用,這里再回顧一下CountDownLatch主要用在一個線程等待多個線程執(zhí)行完畢的情況,而CyclicBarrier用在多個線程互相等待執(zhí)行完畢的情況。

Phaser是java 7 引入的新的并發(fā)API。他引入了新的Phaser的概念,我們可以將其看成一個一個的階段,每個階段都有需要執(zhí)行的線程任務(wù),任務(wù)執(zhí)行完畢就進(jìn)入下一個階段。所以Phaser特別適合使用在重復(fù)執(zhí)行或者重用的情況。

基本使用

在CyclicBarrier、CountDownLatch中,我們使用計(jì)數(shù)器來控制程序的順序執(zhí)行,同樣的在Phaser中也是通過計(jì)數(shù)器來控制。在Phaser中計(jì)數(shù)器叫做parties, 我們可以通過Phaser的構(gòu)造函數(shù)或者register()方法來注冊。

通過調(diào)用register()方法,我們可以動態(tài)的控制phaser的個數(shù)。如果我們需要取消注冊,則可以調(diào)用arriveAndDeregister()方法。

我們看下arrive:

 public int arrive() {
  return doArrive(ONE_ARRIVAL);
 }

Phaser中arrive實(shí)際上調(diào)用了doArrive方法,doArrive接收一個adjust參數(shù),ONE_ARRIVAL表示arrive,ONE_DEREGISTER表示arriveAndDeregister。

Phaser中的arrive()、arriveAndDeregister()方法,這兩個方法不會阻塞,但是會返回相應(yīng)的phase數(shù)字,當(dāng)此phase中最后一個party也arrive以后,phase數(shù)字將會增加,即phase進(jìn)入下一個周期,同時觸發(fā)(onAdvance)那些阻塞在上一phase的線程。這一點(diǎn)類似于CyclicBarrier的barrier到達(dá)機(jī)制;更靈活的是,我們可以通過重寫onAdvance方法來實(shí)現(xiàn)更多的觸發(fā)行為。

下面看一個基本的使用:

 void runTasks(List<Runnable> tasks) {
  final Phaser phaser = new Phaser(1); // "1" to register self
  // create and start threads
  for (final Runnable task : tasks) {
   phaser.register();
   new Thread() {
    public void run() {
     phaser.arriveAndAwaitAdvance(); // await all creation
     task.run();
    }
   }.start();
  }

  // allow threads to start and deregister self
  phaser.arriveAndDeregister();
 }

上面的例子中,我們在執(zhí)行每個Runnable之前調(diào)用register()來注冊, 然后調(diào)用arriveAndAwaitAdvance()來等待這一個Phaser周期結(jié)束。最后我們調(diào)用 phaser.arriveAndDeregister();來取消注冊主線程。

多個Phaser周期

Phaser的值是從0到Integer.MAX_VALUE,每個周期過后該值就會加一,如果到達(dá)Integer.MAX_VALUE則會繼續(xù)從0開始。

如果我們執(zhí)行多個Phaser周期,則可以重寫onAdvance方法:

 protected boolean onAdvance(int phase, int registeredParties) {
  return registeredParties == 0;
 }

onAdvance將會在最后一個arrive()調(diào)用的時候被調(diào)用,如果這個時候registeredParties為0的話,該P(yáng)haser將會調(diào)用isTerminated方法結(jié)束該P(yáng)haser。

如果要實(shí)現(xiàn)多周期的情況,我們可以重寫這個方法:

protected boolean onAdvance(int phase, int registeredParties) {
    return phase >= iterations || registeredParties == 0;
   }

上面的例子中,如果phase次數(shù)超過了指定的iterations次數(shù)則就會自動終止。

我們看下實(shí)際的例子:

 void startTasks(List<Runnable> tasks, final int iterations) {
  final Phaser phaser = new Phaser() {
   protected boolean onAdvance(int phase, int registeredParties) {
    return phase >= iterations || registeredParties == 0;
   }
  };
  phaser.register();
  for (final Runnable task : tasks) {
   phaser.register();
   new Thread() {
    public void run() {
     do {
      task.run();
      phaser.arriveAndAwaitAdvance();
     } while (!phaser.isTerminated());
    }
   }.start();
  }
  phaser.arriveAndDeregister(); // deregister self, don't wait
 }

上面的例子將會執(zhí)行iterations次。

本文的例子請參考https://github.com/ddean2009/learn-java-concurrency/tree/master/Phaser

到此這篇關(guān)于java多線程之Phaser的使用的文章就介紹到這了,更多相關(guān)java多線程Phaser內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot中的@ConfigurationProperties注解解讀

    Spring Boot中的@ConfigurationProperties注解解讀

    在SpringBoot框架中,@ConfigurationProperties注解是處理外部配置的強(qiáng)大工具,它允許開發(fā)者將配置文件中的屬性自動映射到Java類的字段上,實(shí)現(xiàn)配置的集中管理和類型安全,通過定義配置類并指定前綴,可以將配置文件中的屬性綁定到Java對象
    2024-10-10
  • java 反射 動態(tài)調(diào)用不同類的靜態(tài)方法(推薦)

    java 反射 動態(tài)調(diào)用不同類的靜態(tài)方法(推薦)

    下面小編就為大家?guī)硪黄狫AVA 反射 動態(tài)調(diào)用不同類的靜態(tài)方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • Java實(shí)現(xiàn)文件的歸檔和解檔

    Java實(shí)現(xiàn)文件的歸檔和解檔

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)文件的歸檔和解檔,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • JSON序列化Redis讀取出錯問題解決方案

    JSON序列化Redis讀取出錯問題解決方案

    這篇文章主要介紹了JSON序列化Redis讀取出錯問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • 三步輕松搭建springMVC框架

    三步輕松搭建springMVC框架

    這篇文章主要教大家三步輕松搭建springMVC框架,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Java中Scanner的用法示例小結(jié)

    Java中Scanner的用法示例小結(jié)

    有時候我們在編寫代碼的時候可能會使用輸入和輸出,那Java也有自己的輸入和輸出,今天我們來探究一下,對Java Scanner用法相關(guān)知識感興趣的朋友一起看看吧
    2025-04-04
  • 如何應(yīng)對spring框架的HTTP ERROR 400 Bad Request錯誤返回問題

    如何應(yīng)對spring框架的HTTP ERROR 400 Bad Request錯

    這篇文章主要介紹了如何應(yīng)對spring框架的HTTP ERROR 400 Bad Request錯誤返回問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java設(shè)計(jì)模式之抽象工廠模式(Abstract?Factory)

    Java設(shè)計(jì)模式之抽象工廠模式(Abstract?Factory)

    這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式之抽象工廠模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java內(nèi)存屏障詳解

    Java內(nèi)存屏障詳解

    文章主要介紹了內(nèi)存屏障的必要性,以及在多核處理器中如何通過內(nèi)存屏障來保證多線程程序的內(nèi)存可見性和防止指令亂序執(zhí)行,文章還詳細(xì)解釋了內(nèi)存屏障的作用、原理以及常見處理器中的重排序類型
    2025-01-01
  • 利用Java實(shí)現(xiàn)動態(tài)加載數(shù)據(jù)庫

    利用Java實(shí)現(xiàn)動態(tài)加載數(shù)據(jù)庫

    這篇文章主要為大家詳細(xì)介紹了一個java小案例,即動態(tài)加載數(shù)據(jù)庫信息,文中的示例代碼簡潔易懂,具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下
    2023-10-10

最新評論

许昌县| 和龙市| 登封市| 时尚| 增城市| 金华市| 屏南县| 红安县| 北宁市| 诸暨市| 淅川县| 长沙市| 南平市| 上高县| 武平县| 郁南县| 顺义区| 涪陵区| 那曲县| 秀山| 南皮县| 道孚县| 肇庆市| 洮南市| 深泽县| 孝义市| 佛山市| 论坛| 建平县| 上蔡县| 夏邑县| 屏东市| 福州市| 星子县| 梧州市| 桐梓县| 且末县| 揭阳市| 温州市| 鲜城| 株洲县|