当前位置:嗨网首页>书籍在线阅读

22-其他说明

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

其他说明

Phaser 类还提供了其他一些与阶段变化有关的方法,这些方法分别如下。

  • arrive() :该方法将通知 Phaser 类,一个参与者已经完成当前的阶段任务,并将继续执行,不等待该阶段的其他参与者。正是因为该方法并不会与其他线程同步,所以使用时要多加注意。
  • awaitAdvance(int phase) :如果这里传入的参数等于当前 Phaser 对象所处的阶段,则该方法会将当前线程休眠直到所有参与的同步线程完成该阶段;如果传入的参数与 Phaser 对象所处的阶段不同,则方法结束其执行[4]
  • awaitAdvanceInterruptibly(int phaser) :虽然这个方法与上一个方法基本相同,但它是可中断的。如果调用该方法而休眠的线程被中断则抛出 InterruptedException 异常。

动态调整 Phaser 中参与者数量

虽然在创建 Phaser 对象时,就指明了该对象的参与者数量,但是, Phaser 类还提供了两个方法用来动态增加 Phaser 对象的参与者数量,如下。

  • register() :该方法向 Phaser 添加一个新的参与者,并且,默认该参与者还未完成当前阶段。
  • bulkRegister(int parties) :该方法向 Phaser 对象增加指定数量的参与者,并且,默认这些参与者还未完成当前阶段。

Phaser 类仅提供了一个动态减少同步参与者数量的方法: arriveAndDeregister() 。该方法会通知 Phaser 对象该线程已经完成当前阶段并且不再参与后续阶段。

强制终止Phaser

当一个 Phaser 对象没有参与者时,它会进入终止状态。 Phaser 类提供的 forceTermination() 方法可改变 Phaser 对象的状态,不论该对象注册了多少个同步参与者,该方法都会将 Phaser 对象置于终止状态。当 Phaser 对象其中的一个参与者发生错误时,合适的处理方法是终止 Phaser 对象,此时该机制将会变得非常有用。

当一个 Phaser 对象处于终止状态时,调用 awaitAdvance()arriveAndAwait- Advance() 方法将立即返回一个负数(通常状态下,返回的是正数)。如果知道 Phaser 对象可能会被终止,就应该调用这些方法,通过返回值来准确判断 Phaser 对象是否被终止。