类 Join<T>

所有已实现的接口:
ICancelTokenListener

public class Join<T> extends Parallel<T>
Join 1.在得出结果之前不会重复执行已完成的任务。 2.默认为子节点分配独立的取消令牌
作者:
wjybxx date - 2023/12/2
  • 字段详细资料

    • policy

      protected JoinPolicy<T> policy
      子节点的管理策略
    • childPrevReentryIds

      protected transient int[] childPrevReentryIds
      子节点的重入id -- 判断本轮是否需要执行
    • childCancelTokens

      protected transient List<ICancelToken> childCancelTokens
      子节点的取消令牌
    • completedCount

      protected transient int completedCount
      已进入完成状态的子节点
    • succeededCount

      protected transient int succeededCount
      成功完成的子节点
  • 构造器详细资料

    • Join

      public Join()
  • 方法详细资料

    • resetForRestart

      public void resetForRestart()
      从类复制的说明: Task
      重置任务以便重新启动(清理运行产生的所有临时数据)

      1. 和exit一样,清理的是运行时产生的临时数据,而不是所有数据;不过该方法是比exit更彻底的清理。 2. 钩子任务也应当被重置。 3. 与Task.beforeEnter()相同,重写方法时,应先执行父类逻辑,再重置自身属性。 4. 有临时数据的Task都应该重写该方法,行为树通常是需要反复执行的。

      覆盖:
      resetForRestart 在类中 Task<T>
    • beforeEnter

      protected void beforeEnter()
      从类复制的说明: Task
      该方法用于初始化对象。 1.不命名为init,是因为init通常让人觉得只调用一次。 2.该方法不可以使自身进入完成状态。
      覆盖:
      beforeEnter 在类中 Task<T>
    • enter

      protected void enter(int reentryId)
      从类复制的说明: Task
      该方法在Task进入运行状态时执行 1.数据初始化需要放在Task.beforeEnter()中,避免执行逻辑时对象未初始化完成。 2.如果要初始化子节点,也放到Task.beforeEnter()方法; 3.允许更新自己为完成状态
      覆盖:
      enter 在类中 Task<T>
      参数:
      reentryId - 用于判断父类是否使任务进入了完成状态;虽然也可先捕获再调用超类方法,但传入会方便许多。
    • execute

      protected void execute()
      从类复制的说明: Task
      Task的心跳方法,在Task进入完成状态之前会反复执行。 1.可以根据Task.isExecuteTriggeredByEnter()判断是否是与Task.enter(int)连续执行的。 2.运行中可通过Task.setSuccess()Task.setFailed(int) ()}、Task.setCancelled()将自己更新为完成状态。 3.不建议直接调用该方法,而是通过模板方法运行。
      指定者:
      execute 在类中 Task<T>
    • onChildCompleted

      protected void onChildCompleted(Task<T> child)
      从类复制的说明: Task
      子节点进入完成状态 1.避免方法数太多,实现类测试task的status即可 2.Task.getNormalizedStatus()有助于switch测试 3.task可能是取消状态,甚至可能没运行过直接失败(前置条件失败) 4.钩子任务和guard不会调用该方法 5.Task.isExecuting()有助于检测冲突,减少调用栈深度 6.同一子节点连续通知的情况下,completed的逻辑应当覆盖Task.onChildRunning(Task)的影响。 7.任何的回调和事件方法中都由用户自身检测取消信号
      指定者:
      onChildCompleted 在类中 Task<T>
    • onEventImpl

      protected void onEventImpl(@Nonnull Object event)
      从类复制的说明: Task
      对于控制节点,通常将事件派发给约定的子节点或钩子节点。 对于叶子节点,通常自身处理事件。 注意: 1.转发事件时应该调用子节点的Task.onEvent(Object)方法 2.在AI这样的领域中,建议将事件转化为信息存储在Task或黑板中,而不是尝试立即做出反应。 3.Task.isExecuting()方法很重要
      指定者:
      onEventImpl 在类中 Task<T>
    • isAllChildCompleted

      public boolean isAllChildCompleted()
      覆盖:
      isAllChildCompleted 在类中 BranchTask<T>
    • isAllChildSucceeded

      public boolean isAllChildSucceeded()
    • getCompletedCount

      public int getCompletedCount()
    • getSucceededCount

      public int getSucceededCount()
    • getPolicy

      public JoinPolicy<T> getPolicy()
    • setPolicy

      public void setPolicy(JoinPolicy<T> policy)