类 Join<E>
java.lang.Object
cn.wjybxx.btree.Task<E>
cn.wjybxx.btree.BranchTask<E>
cn.wjybxx.btree.branch.Parallel<E>
cn.wjybxx.btree.branch.Join<E>
Join
1.在得出结果之前不会重复执行已完成的任务。
2.默认为子节点分配独立的取消令牌
- 作者:
- wjybxx date - 2023/12/2
-
字段概要
字段修饰符和类型字段说明protected int[]子节点的重入id -- 判断本轮是否需要执行protected int已进入完成状态的子节点protected JoinPolicy<E> protected int成功完成的子节点从类继承的字段 cn.wjybxx.btree.BranchTask
children -
构造器概要
构造器 -
方法概要
修饰符和类型方法说明protected void该方法用于初始化对象。protected voidenter(int reentryId) 该方法在Task进入运行状态时执行 1.数据初始化需要放在Task.beforeEnter()中,避免执行逻辑时对象未初始化完成。protected voidexecute()Task的心跳方法,在Task进入完成状态之前会反复执行。intintbooleanbooleanprotected voidonChildCompleted(Task<E> child) 子节点进入完成状态 1.避免方法数太多,实现类测试task的status即可 2.Task.getNormalizedStatus()有助于switch测试 3.task可能是取消状态,甚至可能没运行过直接失败(前置条件失败) 4.钩子任务和guard不会调用该方法 5.Task.isExecuting()有助于检测冲突,减少调用栈深度 6.同一子节点连续通知的情况下,completed的逻辑应当覆盖Task.onChildRunning(Task)的影响。protected voidonEventImpl(Object event) 对于控制节点,通常将事件派发给约定的子节点或钩子节点。void重置任务以便重新启动(清理运行产生的所有临时数据)voidsetPolicy(JoinPolicy<E> policy) 从类继承的方法 cn.wjybxx.btree.branch.Parallel
onChildRunning从类继承的方法 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, exit, getBlackboard, getCancelToken, getControl, getControlData, getCurFrame, getEnterFrame, getEntity, getEntryBlackboard, getExitFrame, getFlags, getGuard, getNormalizedStatus, getPrevStatus, getReentryId, getRunFrames, getSharedProps, getStatus, getTaskEntry, isAutoCheckCancel, isAutoListenCancel, isAutoResetChildren, isCancelled, isCompleted, isDisableDelayNotify, isDisableEnterExecute, isExecuteTriggeredByEnter, isExecuting, isExited, isExitTriggeredByStop, isFailed, isFailedOrCancelled, isLocked, isReentered, isRunning, isStillborn, isSucceeded, lock, onCancelRequested, onEvent, removeChild, removeChild, resetChildrenForRestart, resetForRestart, setAutoCheckCancel, setAutoListenCancel, setAutoResetChildren, setBlackboard, setCancelled, setCancelToken, setChild, setCompleted, setControl, setControlData, setDisableDelayNotify, setDisableEnterExecute, setEnterFrame, setExitFrame, setFailed, setFlags, setGuard, setGuardFailed, setSharedProps, setSuccess, stop, stop, stopRunningChildren, stopSafely, template_checkGuard, template_execute, template_runChild, template_runChildDirectly, template_runHook, template_runHookDirectly, tryLock, unlock, unsetControl
-
字段详细资料
-
policy
-
childPrevReentryIds
protected transient int[] childPrevReentryIds子节点的重入id -- 判断本轮是否需要执行 -
completedCount
protected transient int completedCount已进入完成状态的子节点 -
succeededCount
protected transient int succeededCount成功完成的子节点
-
-
构造器详细资料
-
Join
public Join()
-
-
方法详细资料
-
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>
-
enter
protected void enter(int reentryId) 从类复制的说明:Task该方法在Task进入运行状态时执行 1.数据初始化需要放在Task.beforeEnter()中,避免执行逻辑时对象未初始化完成。 2.如果要初始化子节点,也放到Task.beforeEnter()方法; 3.允许更新自己为完成状态 -
execute
protected void execute()从类复制的说明:TaskTask的心跳方法,在Task进入完成状态之前会反复执行。 1.可以根据Task.isExecuteTriggeredByEnter()判断是否是与Task.enter(int)连续执行的。 2.运行中可通过Task.setSuccess()、Task.setFailed(int)()}、Task.setCancelled()将自己更新为完成状态。 3.不建议直接调用该方法,而是通过模板方法运行。 -
onChildCompleted
从类复制的说明:Task子节点进入完成状态 1.避免方法数太多,实现类测试task的status即可 2.Task.getNormalizedStatus()有助于switch测试 3.task可能是取消状态,甚至可能没运行过直接失败(前置条件失败) 4.钩子任务和guard不会调用该方法 5.Task.isExecuting()有助于检测冲突,减少调用栈深度 6.同一子节点连续通知的情况下,completed的逻辑应当覆盖Task.onChildRunning(Task)的影响。 7.任何的回调和事件方法中都由用户自身检测取消信号- 指定者:
onChildCompleted在类中Task<E>
-
onEventImpl
从类复制的说明:Task对于控制节点,通常将事件派发给约定的子节点或钩子节点。 对于叶子节点,通常自身处理事件。 注意: 1.转发事件时应该调用子节点的Task.onEvent(Object)方法 2.在AI这样的领域中,建议将事件转化为信息存储在Task或黑板中,而不是尝试立即做出反应。 3.Task.isExecuting()方法很重要- 指定者:
onEventImpl在类中Task<E>
-
isAllChildCompleted
public boolean isAllChildCompleted()- 覆盖:
isAllChildCompleted在类中BranchTask<E>
-
isAllChildSucceeded
public boolean isAllChildSucceeded() -
getCompletedCount
public int getCompletedCount() -
getSucceededCount
public int getSucceededCount() -
getPolicy
-
setPolicy
-