PhaserDemo

package com.smart.thread;

import java.io.IOException;
import java.util.concurrent.Phaser;

/**

  • 一种任务可以分为多个阶段,现希望多个线程去处理该批任务,对于每个阶段,多个线程可以并发进行,

  • 但是希望保证只有前面一个阶段的任务完成之后才能开始后面的任务。

  • 这种场景可以使用多个CyclicBarrier来实现,每个CyclicBarrier负责等待一个阶段的任务全部完成。

  • 但是使用CyclicBarrier的缺点在于,需要明确知道总共有多少个阶段,同时并行的任务数需要提前预定义好,

  • 且无法动态修改。而Phaser可同时解决这两个问题。

  • Created by jinxiaoyu on 17/4/11.
    */
    public class PhaserDemo {
    public static void main(String[] args) throws IOException {
    int parties = 3;
    final int phases = 4;
    final Phaser phaser = new Phaser(parties) {
    @Override
    protected boolean onAdvance(int phase, int registeredParties) {
    System.out.println("====== Phase : " + phase + " ======");
    return registeredParties == 0;
    }
    };

     for(int i = 0; i < parties; i++) {
         final int threadId = i;
         final Thread thread = new Thread() {
             @Override
             public void run() {
                 for (int phase = 0; phase < phases; phase++) {
                     System.out.println(String.format("Thread %s, phase %s", threadId, phase));
                     phaser.arriveAndAwaitAdvance();
                 }
             }
         };
         thread.start();
     }
    

    }
    }

Thread 1, phase 0
Thread 2, phase 0
Thread 0, phase 0
====== Phase : 0 ======
Thread 1, phase 1
Thread 0, phase 1
Thread 2, phase 1
====== Phase : 1 ======
Thread 0, phase 2
Thread 1, phase 2
Thread 2, phase 2
====== Phase : 2 ======
Thread 1, phase 3
Thread 0, phase 3
Thread 2, phase 3
====== Phase : 3 ======

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,890评论 18 139
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,769评论 0 33
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,760评论 18 399
  • CyclicBarrier 如果说CountDownLatch是一次性的,那么CyclicBarrier正好可以循...
    raincoffee阅读 560评论 0 1
  • 2013年9月1日 星期日 晴 对不起啊,昨天忘记写了。 虽然要半个月才能回家,才能过中秋,但我还是满怀期待的。毕...
    岑白笺阅读 156评论 0 0