目前正在出一个Java多线程专题长期系列教程,从入门到进阶含源码解读, 篇幅会较多, 喜欢的话,给个关注❤️ ~,我来为大家讲解一下关于技术开发面试穿什么?跟着小编一起来看一看吧!
技术开发面试穿什么
面试官: Phaser有了解过吗?说说看前言目前正在出一个Java多线程专题长期系列教程,从入门到进阶含源码解读, 篇幅会较多, 喜欢的话,给个关注❤️ ~
Java提供了一些非常好用的并发工具类,不需要我们重复造轮子,本节我们讲解Phaser,一起来看下吧~
PhaserPhaser又称“阶段器”,用来解决多线程分阶段任务的场景。它与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有了解过吗?说说看(源码剖析)
- 我的博客(阅读体验较佳)
- java-thread-all
- 地址: https://github.com/qiuChengleiy/java-thread-all.git
- springboot-all
- 地址: https://github.com/qiuChengleiy/springboot-all.git
- SpringBoot系列教程合集
- 一起来学SpringCloud合集