整理java7中几种常见同步辅助类-Phaser

来源:互联网 发布:三维产品动画演示软件 编辑:程序博客网 时间:2024/06/07 11:42

1.Phaser

1.1解释

phaser用于并发阶段任务的运行,适用于有并发任务且需要分解成多步执行。另外Phaser类的方法不需要进行异常处理,它们不响应中断异常。

1.2基本工作流程

Phaser在任务每一步结束的位置对线程进行同步,当所有线程都完成这一步时,才允许执行下一步

1.3phaser的状态

1.活跃态(active)


2.终止态(termination)


3.注:

(1)当Phaser对象不存在参与同步的线程时,phaser是终止状态的,isTerminated()方法将返回true。

(2)phaser对象处于终止态时,arriveAndAwaitAdvance()会立即返回,而且不会做任何同步操作

1.3常见方法

arriveAndAwaitAdvance():当一个线程调用该方法时,Phaser对象将该线程置于休眠状态,直到所有其他线程完成这个阶段。当Phaser处于终止态时,返回负数

register():将一个新的参与者注册到Phaser中,新参与者被当成没有执行当前阶段。注:Phaser中参与者数目只是一个数字,phaser与参与者没有任何关联

bulkRegister():将指定数目的参与者注册到Phaser中,所有新参与者都被当成没有执行当前阶段

arriveAndDeregister():通知Phaser当前线程已经完成当前阶段,并且它不会参与到下一阶段任务中。

forceTermination():强制Phaser进入终止态。当一个线程产生错误时,强制终止Phaser是有意义的。

onAdvanced():该方法在Phaser阶段改变时自动被调用。接收2个参数,分别是当前阶段数以及参与者数量(阶段数从0开始)。返回值为boolean类型,若返回true,表示Phaser已经完成执行并进入终止态。若返回false表示Phaser还正在执行。该方法有一个默认实现,若参与者数量为0就返回true,否则返回false。若需要自定义某些操作,可以继承Phaser类覆盖该方法。注:Phaser对象进行阶段切换时,该方法在所有被休眠的线程被唤醒之前调用。

getRegisteredParties():获取Phaser中注册的参与者数量

可以改变Phaser对象的方法:

arrive():表示一个线程已经完成了当前阶段,并且不会等待其他线程也完成该阶段

awaitAdvance(Int phase):接受一个参数,如果传入参数与当前阶段数一致,则将当前线程置于休眠并等待其他线程完成该阶段。若不一致,立即返回。注:若Phaser处于终止态返回负数

awaitAdvanceInterruptibly(int phaser):该方法和awaitAdvance(int phase)异同点是该方法会响应中断异常,抛出InterruptedException异常

1.4常用构造器

Phaser(int parties):接受一个int类型参数,表示参与同步的线程数量