java.lang.Object
cn.wjybxx.btree.Task<T>
cn.wjybxx.btree.BranchTask<T>
cn.wjybxx.btree.branch.SingleRunningChildBranch<T>
- 所有已实现的接口:
ICancelTokenListener
非并行分支节点抽象(最多只有一个运行中的子节点)
如果
execute()方法是有循环体的,那么一定要注意:
只有循环的尾部运行child才是安全的,如果在运行child后还读写其它数据,可能导致bug(小心递归)。- 作者:
- wjybxx date - 2023/11/26
-
字段概要
字段从类继承的字段 cn.wjybxx.btree.BranchTask
children -
构造器概要
构造器构造器说明SingleRunningChildBranch(Task<T> first, Task<T> second) SingleRunningChildBranch(List<Task<T>> children) -
方法概要
修饰符和类型方法说明protected void该方法用于初始化对象。protected voidexecute()Task的心跳方法,在Task进入完成状态之前会反复执行。protected voidexit()该方法在Task进入完成状态时执行 1.该方法与Task.enter(int)对应,通常用于停止Task.enter(int)中启动的逻辑。int已完成的子节点数量final int允许外部在结束后查询protected final Stringbooleanprotected voidonChildCompleted(Task<T> child) 子类的实现模板:protected voidonChildRunning(Task<T> child) 子节点还需要继续运行 1.child在运行期间只会通知一次 2.该方法不应该触发状态迁移,即不应该使自己进入完成状态protected voidonEventImpl(Object event) 对于控制节点,通常将事件派发给约定的子节点或钩子节点。void重置任务以便重新启动(清理运行产生的所有临时数据)protected void停止所有运行中的子节点 1.该方法在自身的exit之前调用 2.如果有特殊的子节点(钩子任务),也需要在这里停止从类继承的方法 cn.wjybxx.btree.BranchTask
addChildImpl, childStream, getChild, getChildCount, getChildren, getFirstChild, getLastChild, indexChild, isFirstChild, isLastChild, removeAllChild, removeChildImpl, setChildImpl, setChildren, shuffleChild从类继承的方法 cn.wjybxx.btree.Task
addChild, canHandleEvent, checkCancel, enter, getBlackboard, getCancelToken, getControl, getControlData, getCurFrame, getEnterFrame, getEntity, getEntryBlackboard, getExitFrame, getFlags, getGuard, getNormalizedStatus, getPrevStatus, getReentryId, getRunFrames, getSharedProps, getStatus, getTaskEntry, isAutoCheckCancel, isAutoListenCancel, isAutoResetChildren, isCancelled, isCompleted, isDisableDelayNotify, isExecuteTriggeredByEnter, isExecuting, isExited, isExitTriggeredByStop, isFailed, isFailedOrCancelled, isLocked, isNotified, isReentered, isRunning, isSlowStart, isStillborn, isSucceeded, lock, onCancelRequested, onEvent, removeChild, removeChild, resetChildrenForRestart, resetForRestart, setAutoCheckCancel, setAutoListenCancel, setAutoResetChildren, setBlackboard, setCancelled, setCancelToken, setChild, setCompleted, setControl, setControlData, setDisableDelayNotify, setEnterFrame, setExitFrame, setFailed, setFlags, setGuard, setGuardFailed, setPrevStatus, setSharedProps, setSlowStart, setSuccess, stop, stop, template_checkGuard, template_execute, template_runChild, template_runChildDirectly, template_runHook, template_runHookDirectly, tryLock, unlock, unsetControl
-
字段详细资料
-
runningChild
运行中的子节点 -
runningIndex
protected transient int runningIndex运行中的子节点索引
-
-
构造器详细资料
-
SingleRunningChildBranch
public SingleRunningChildBranch() -
SingleRunningChildBranch
-
SingleRunningChildBranch
-
-
方法详细资料
-
getRunningIndex
public final int getRunningIndex()允许外部在结束后查询 -
getCompletedCount
public int getCompletedCount()已完成的子节点数量 -
isAllChildCompleted
public boolean isAllChildCompleted()- 覆盖:
isAllChildCompleted在类中BranchTask<T>
-
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>
-
exit
protected void exit()从类复制的说明:Task该方法在Task进入完成状态时执行 1.该方法与Task.enter(int)对应,通常用于停止Task.enter(int)中启动的逻辑。 2.该方法也用于清理部分运行时产生的临时数据。 3.一定记得取消注册的各种监听器。 -
stopRunningChildren
protected void stopRunningChildren()从类复制的说明:Task停止所有运行中的子节点 1.该方法在自身的exit之前调用 2.如果有特殊的子节点(钩子任务),也需要在这里停止- 覆盖:
stopRunningChildren在类中Task<T>
-
onEventImpl
从类复制的说明:Task对于控制节点,通常将事件派发给约定的子节点或钩子节点。 对于叶子节点,通常自身处理事件。 注意: 1.转发事件时应该调用子节点的Task.onEvent(Object)方法 2.在AI这样的领域中,建议将事件转化为信息存储在Task或黑板中,而不是尝试立即做出反应。 3.Task.isExecuting()方法很重要- 指定者:
onEventImpl在类中Task<T>
-
execute
protected void execute()从类复制的说明:TaskTask的心跳方法,在Task进入完成状态之前会反复执行。 1.可以根据Task.isExecuteTriggeredByEnter()判断是否是与Task.enter(int)连续执行的。 2.运行中可通过Task.setSuccess()、Task.setFailed(int)()}、Task.setCancelled()将自己更新为完成状态。 3.不建议直接调用该方法,而是通过模板方法运行。 -
nextChild
-
illegalStateMsg
-
onChildRunning
从类复制的说明:Task子节点还需要继续运行 1.child在运行期间只会通知一次 2.该方法不应该触发状态迁移,即不应该使自己进入完成状态- 指定者:
onChildRunning在类中Task<T>
-
onChildCompleted
子类的实现模板:protected void onChildCompleted(Task child) { runningChild = null; // 尝试计算结果(记得处理取消) ... // 如果未得出结果 if (!isExecuting()) { template_execute(); } }- 指定者:
onChildCompleted在类中Task<T>
-