多线程之阶段运行———Phaser

场景:n个线程但是需要分阶段执行,并且每个阶段是符合一定条件的,以小组为单位,必须该阶段该小组的所有线程都完成了任务,才可以进行下一步任务。
可以理解为分阶段的栅栏,并且每个阶段都可以指定不同的线程

我模拟了一个学习的阶段任务小程序:

package com.hezhanghuaixiao.apipaaenger.learn;

import java.time.Period;
import java.util.Random;
import java.util.concurrent.Phaser;

/**
 * @author 何章怀晓 hezhanghuaixiao
 * @version V1.0
 * @desc
 */
public class Test0424Phaser {

  static Random random = new Random();

  static MarriagePhaser marriagePhaser = new MarriagePhaser();

  static void millisSleep(int mill) {
    try {
      Thread.sleep(mill);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public static void main(String[] args) {
    //线程容量
    marriagePhaser.bulkRegister(7);

    //第一阶段
    new Thread(new Skill("初学java")).start();
    //第二阶段
    new Thread(new Skill("进阶学习数据结构")).start();
    new Thread(new Skill("进阶学习设计模式")).start();
    //第三阶段
    new Thread(new Skill("进阶学习算法")).start();
    new Thread(new Skill("进阶学习源码解读")).start();
    //第四阶段
    new Thread(new Skill("进阶学习三高调优")).start();
    //第五阶段
    new Thread(new Skill("成为架构师")).start();


  }


  static class MarriagePhaser extends Phaser {
    //return true==> 阶段结束
    //registeredParties 注册的线程数量

    @Override
    protected boolean onAdvance(int phase, int registeredParties) {
      switch (phase) {
        case 0:
          System.out.println("-----------菜鸟阶段");
          return false;
        case 1:
          System.out.println("-----------学习阶段");
          return false;
        case 2:
          System.out.println("-----------进阶阶段");

          return false;
        case 3:
          System.out.println("-----------生产阶段");
          return false;
        case 4:
          System.out.println("-----------上升阶段");
          return true;
        default:
          return true;
      }
    }
  }


  static class Skill implements Runnable {

    String name;

    public Skill(String name) {
      this.name = name;
    }


    public void initial() {
      millisSleep(random.nextInt(1000));
      if (name.equals("初学java")) {
        System.out.println("第一阶段" + name);
      }
      //该阶段任务完成才可以进入下一阶段
      marriagePhaser.arriveAndAwaitAdvance();
    }

    public void advanced() {
      millisSleep(random.nextInt(1000));
      if (name.equals("进阶学习数据结构") || name.equals("进阶学习设计模式")) {
        System.out.println("第二阶段" + name);
      }
      //该阶段任务完成才可以进入下一阶段
      marriagePhaser.arriveAndAwaitAdvance();
    }

    public void keepLearning() {
      millisSleep(random.nextInt(1000));
      if (name.equals("进阶学习算法") || name.equals("进阶学习源码解读")) {
        System.out.println("第三阶段" + name);
      }
      //该阶段任务完成才可以进入下一阶段
      marriagePhaser.arriveAndAwaitAdvance();
    }

    public void tuning() {
      millisSleep(random.nextInt(1000));
      if (name.equals("进阶学习三高调优")) {
        System.out.println("第四阶段" + name);
      }
      //该阶段任务完成才可以进入下一阶段
      marriagePhaser.arriveAndAwaitAdvance();
    }

    public void architect() {
      if (name.equals("成为架构师")) {
        millisSleep(random.nextInt(1000));
        System.out.println("第五阶段" + name);
        marriagePhaser.arriveAndAwaitAdvance();
      } /*else {
        //取消注册
        marriagePhaser.arriveAndDeregister();
      }*/


    }

    public void stop() {
      marriagePhaser.forceTermination();
    }

    @Override
    public void run() {
      initial();
      advanced();
      keepLearning();
      tuning();
      architect();
      stop();


    }
  }


}

在这里插入图片描述

这个场景比较简单,但是Phaser拓展性很强,可以根据场景拟定不同策略

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值