类 SingleRunningChildBranch<E>

java.lang.Object
cn.wjybxx.btree.Task<E>
cn.wjybxx.btree.BranchTask<E>
cn.wjybxx.btree.branch.SingleRunningChildBranch<E>
直接已知子类:
ActiveSelector, Foreach, Selector, SelectorN, Sequence, Switch

public abstract class SingleRunningChildBranch<E> extends BranchTask<E>
非并行分支节点抽象 如果execute()方法是有循环体的,那么一定要注意: 只有循环的尾部运行child才是安全的,如果在运行child后还读写其它数据,可能导致bug(小心递归)。
作者:
wjybxx date - 2023/11/26
  • 字段详细资料

    • runningChild

      protected transient Task<E> runningChild
      运行中的子节点
    • runningIndex

      protected transient int runningIndex
      运行中的子节点索引
  • 构造器详细资料

    • SingleRunningChildBranch

      public SingleRunningChildBranch()
    • SingleRunningChildBranch

      public SingleRunningChildBranch(List<Task<E>> children)
    • SingleRunningChildBranch

      public SingleRunningChildBranch(Task<E> first, @Nullable Task<E> second)
  • 方法详细资料

    • getRunningIndex

      public final int getRunningIndex()
      允许外部在结束后查询
    • getCompletedCount

      public int getCompletedCount()
      已完成的子节点数量
    • isAllChildCompleted

      public boolean isAllChildCompleted()
      覆盖:
      isAllChildCompleted 在类中 BranchTask<E>
    • resetForRestart

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

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

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

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

      protected void exit()
      从类复制的说明: Task
      该方法在Task进入完成状态时执行 1.该方法与Task.enter(int)对应,通常用于停止Task.enter(int)中启动的逻辑。 2.该方法也用于清理部分运行时产生的临时数据。 3.一定记得取消注册的各种监听器。
      覆盖:
      exit 在类中 Task<E>
    • stopRunningChildren

      protected void stopRunningChildren()
      从类复制的说明: Task
      停止所有运行中的子节点 1.该方法在自身的exit之前调用 2.如果有特殊的子节点(钩子任务),也需要在这里停止
      覆盖:
      stopRunningChildren 在类中 Task<E>
    • onEventImpl

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

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

      protected Task<E> nextChild()
    • illegalStateMsg

      protected final String illegalStateMsg()
    • onChildRunning

      protected void onChildRunning(Task<E> child)
      从类复制的说明: Task
      子节点还需要继续运行 1.child在运行期间只会通知一次 2.该方法不应该触发状态迁移,即不应该使自己进入完成状态
      指定者:
      onChildRunning 在类中 Task<E>
    • onChildCompleted

      protected void onChildCompleted(Task<E> child)
      子类的实现模板:
      
      
        protected void onChildCompleted(Task child) {
            runningChild = null;
            // 尝试计算结果
            ...
            // 如果未得出结果
            if (!isExecuting()) {
                template_execute();
            }
        }
      
       
      指定者:
      onChildCompleted 在类中 Task<E>