天天看点

java并发编程之Phaser的使用

通过使用CyclicBarrier类解决了CountDownLatch类的种种缺点,但不可否认的是,CyclicBarrier类还是有一些自身上的缺陷,比如不可以动态添加parties计数,调用一个await()方法仅仅占用一个parties计数,所以jdk7中新增一个名称为Phaser的类来解决这样的问题。

3.2类Phaser的arriveAndAwaitAdvance()的方法

//创建一个新的移相器,包含给定已注册的未到达的parties,无父级,初始阶段号为0
Phaser phaser = new Phaser(3);
           

这个方法的作用就是当前线程已经到达屏障,在此等待一段时间,等条件满足后继续向下一个屏障继续执行。

类Phaser具有设置多屏障的功能

3.3类Phaser的arriveAndDeregister()方法

方法arriveAndDeregister()的作用是使当前线程退出,并且使parties值减1

3.4类Phaser的getPhase()和onAdvance()方法

方法getPhase()获取的是已经到达第几个屏障。

方法onAdvance()的作用是通过新的屏障时被调用

3.5类Phaser的getRegisteredParties()方法和register()方法

方法getRegisteredParties(0获得注册的parties数量

每执行一次方法register()就动态添加一个parties值

3.6类Phaser的bulkRegister()方法

方法bulkRegister()可以批量增加parties数量

Phaser phaser = new Phaser(10);
phaser.bulkRegister(10);
parties数量变为了20
           

3.5类Phaser的getArrivedParties()和getUnarrivedParties()方法

方法getArrivedParties()获得已经被使用的parties个数

方法getUnarrivedParties()获得未被使用的parties个数

3.6类Phaser的arrive()方法

方法arrive()的作用是使parties值加1,并且不再屏障处等待,直接向下面的代码继续运行,并且Phaser类有计数重置功能。

3.7类Phaser的awaitAdvance(int phase)方法

方法awaitAdvance(int Phase)的作用是:如果传入参数phase值和当前getPhase()方法返回值一样,而在屏障处等待,否则继续向下面运行,有些类似于旁观者的作用,当观察的条件满足了就等待,如果条件不满足,则程序向下继续运行。

3.8类Phaser的awaitAdvanceInterruptibly(int)方法

方法awaitAdvanceInterruptibly(int) 的作用是当线程执行的栏数不符合指定的参数值时,则继续执行下面的代码。

3.9类Phaser的awaitAdvanceInterruptibly(int phase,long timeout,TimeUnit unit)方法

awaitAdvanceInterruptibly(int phase,long timeout,TimeUnit unit)的作用是在指定的栏数等待最大的单位时间,如果在指定的时间内,栏数未变,则出现异常,否则继续向下运行。

3.10类Phaser的forceTermination()和isTerminated()方法

方法forceTermination() 使Phaser对象的屏障功能失效,而方法isTerminnated()是判断Phaser对象是否已经呈销毁状态

3.11 控制Phaser类的运行时机

本章总结:

类Phaser提供了动态增减parties计数,这点比CyclicBarrier类操作parties更加方便,通过若干个方法来控制多个线程之间同步运行的效果,还可以实现针对某一个线程取消同步运行的效果,而且指定屏障处等待,在等待时机还支持中断或非中断等功能,使用java并发类对线程进行分组同步控制时,Phaser比CyclicBarrier类功能更加强大,建议使用。

继续阅读