技术开发面试穿什么(面试官Phaser有了解过吗)

目前正在出一个Java多线程专题长期系列教程,从入门到进阶含源码解读, 篇幅会较多, 喜欢的话,给个关注❤️ ~,我来为大家讲解一下关于技术开发面试穿什么?跟着小编一起来看一看吧!

技术开发面试穿什么(面试官Phaser有了解过吗)

技术开发面试穿什么

面试官: Phaser有了解过吗?说说看前言

目前正在出一个Java多线程专题长期系列教程,从入门到进阶含源码解读, 篇幅会较多, 喜欢的话,给个关注❤️ ~

Java提供了一些非常好用的并发工具类,不需要我们重复造轮子,本节我们讲解Phaser,一起来看下吧~

Phaser

Phaser又称“阶段器”,用来解决多线程分阶段任务的场景。它与CountDownLatch和CyclicBarrier类似,都是等待一组线程完成工作后再执行下一步。但CountDownLatch和CyclicBarrier中不能动态的配置parties,而Phaser可以动态注册,相对而言更加的灵活。

常用方法
  • int register() 动态添加一个parties
  • int bulkRegister(int parties) 动态添加多个parties
  • int getRegisteredParties() 获取当前的parties数
  • int arriveAndAwaitAdvance() 到达并等待其他线程到达
  • int arriveAndDeregister() 到达并注销该parties,这个方法不会使线程阻塞
  • int arrive() 到达,但不会使线程阻塞
  • int awaitAdvance(int phase) 等待前行,可阻塞也可不阻塞,判断条件为phase,如果相等则阻塞
  • int awaitAdvanceInterruptibly(int phase) 该方法与awaitAdvance类似,唯一不一样的就是它可以进行打断。
  • int awaitAdvanceInterruptibly(int phase, long timeout, TimeUnit unit) 同上
  • int getArrivedParties() 获取当前到达的parties数
  • int getUnarrivedParties() 获取当前未到达的parties数
  • int getPhase() 获取当前属于第几阶段,默认从0开始,最大为integer的最大值
  • boolean isTerminated() 判断当前phaser是否关闭
  • void forceTermination() 强制关闭当前phaser
示例

基本上把能用到的方法都给大家介绍了,下面我们通过一个例子实际体验一下:

public class PhaserTest { public static void main(String[] args) { Phaser phaser = new Phaser(10); for (int i=0; i<10; i ){ new Thread(() -> { try { long millis = System.currentTimeMillis(); System.out.println(millis "--1-->当前处于" phaser.getPhase() "阶段"); Thread.sleep(1000); // wait phaser.arriveAndAwaitAdvance(); System.out.println(millis "---2--->当前处于" phaser.getPhase() "阶段"); Thread.sleep(1000); // wait phaser.arriveAndAwaitAdvance(); System.out.println(millis "---3--->当前处于" phaser.getPhase() "阶段"); Thread.sleep(1000); // wait phaser.arriveAndAwaitAdvance(); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); } System.out.println("主线程"); } }

实际输出:

1659925927951--1-->当前处于0阶段 主线程 1659925927951--1-->当前处于0阶段 1659925927951--1-->当前处于0阶段 1659925927950--1-->当前处于0阶段 1659925927951--1-->当前处于0阶段 1659925927951--1-->当前处于0阶段 1659925927951--1-->当前处于0阶段 1659925927951--1-->当前处于0阶段 1659925927950--1-->当前处于0阶段 1659925927951--1-->当前处于0阶段 1659925927951---2--->当前处于1阶段 1659925927950---2--->当前处于1阶段 1659925927951---2--->当前处于1阶段 1659925927950---2--->当前处于1阶段 1659925927951---2--->当前处于1阶段 1659925927951---2--->当前处于1阶段 1659925927951---2--->当前处于1阶段 1659925927951---2--->当前处于1阶段 1659925927951---2--->当前处于1阶段 1659925927951---2--->当前处于1阶段 1659925927951---3--->当前处于2阶段 1659925927951---3--->当前处于2阶段 1659925927950---3--->当前处于2阶段 1659925927951---3--->当前处于2阶段 1659925927950---3--->当前处于2阶段 1659925927951---3--->当前处于2阶段 1659925927951---3--->当前处于2阶段 1659925927951---3--->当前处于2阶段 1659925927951---3--->当前处于2阶段 1659925927951---3--->当前处于2阶段

可以看出并不会造成主线程的阻塞,任务也是分阶段去完成的, 其它方法就不一一演示了,大家可以自行操作一下

结束语

本节主要讲解它的一个使用,有兴趣的同学可以看一下它的底层源码实现,相对于前两个要复杂一点,这里就不过多介绍。下一节,给大家讲下Fork/Join框架,关注我,不迷路 ~

往期并发编程内容推荐
  • Java多线程专题之线程与进程概述
  • Java多线程专题之线程类和接口入门
  • Java多线程专题之进阶学习Thread(含源码分析)
  • Java多线程专题之Callable、Future与FutureTask(含源码分析)
  • 面试官: 有了解过线程组和线程优先级吗
  • 面试官: 说一下线程的生命周期过程
  • 面试官: 说一下线程间的通信
  • 面试官: 说一下Java的共享内存模型
  • 面试官: 有了解过指令重排吗,什么是happens-before
  • 面试官: 有了解过volatile关键字吗 说说看
  • 面试官: 有了解过Synchronized吗 说说看
  • Java多线程专题之Lock锁的使用
  • 面试官: 有了解过ReentrantLock的底层实现吗?说说看
  • 面试官: 有了解过CAS和原子操作吗?说说看
  • Java多线程专题之线程池的基本使用
  • 面试官: 有了解过线程池的工作原理吗?说说看
  • 面试官: 线程池是如何做到线程复用的?有了解过吗,说说看
  • 面试官: 阻塞队列有了解过吗?说说看
  • 面试官: 阻塞队列的底层实现有了解过吗? 说说看
  • 面试官: 同步容器和并发容器有用过吗? 说说看
  • 面试官: CopyOnWrite容器有了解过吗? 说说看
  • 面试官: Semaphore在项目中有使用过吗?说说看(源码剖析)
  • 面试官: Exchanger在项目中有使用过吗?说说看(源码剖析)
  • 面试官: CountDownLatch有了解过吗?说说看(源码剖析)
  • 面试官: CyclicBarrier有了解过吗?说说看(源码剖析)
  • 我的博客(阅读体验较佳)
项目源码(源码已更新 欢迎star⭐️)
  • java-thread-all
  • 地址: https://github.com/qiuChengleiy/java-thread-all.git
推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)
  • springboot-all
  • 地址: https://github.com/qiuChengleiy/springboot-all.git
  • SpringBoot系列教程合集
  • 一起来学SpringCloud合集
,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页