輸出:
processMsg: Controller$DefaultState
ApStaDisabledState-->enter()
狀態棧中存在2個狀態分別爲
msg = 1
0 DefaultState state=Controller$DefaultState,parent=null
1 ApStaDisabledState state=Controller$ApStaDisabledState,parent=Controller$DefaultState
=============================================
processMsg: Controller$ApStaDisabledState
processMsg: Controller$DefaultState
invokeExitMethods: Controller$ApStaDisabledState
ApStaDisabledState-->exit()
StaEnabledState -->enter()
狀態棧中存在2個狀態分別爲
msg = 2
0 DefaultState state=Controller$DefaultState,parent=null
1 StaEnabledState state=Controller$StaEnabledState,parent=Controller$DefaultState
=============================================
processMsg: Controller$StaEnabledState
DeviceActiveState -->enter()
狀態棧中存在3個狀態分別爲
msg = 3
0 DefaultState state=Controller$DefaultState,parent=null
1 StaEnabledState state=Controller$StaEnabledState,parent=Controller$DefaultState
2 DeviceActiveState state=Controller$DeviceActiveState,parent=Controller$StaEnabledState
=============================================
processMsg: Controller$DeviceActiveState
processMsg: Controller$StaEnabledState
invokeExitMethods: Controller$DeviceActiveState
DeviceActiveState -->exit()
DeviceInactiveState -->enter()
狀態棧中存在3個狀態分別爲
msg = 4
0 DefaultState state=Controller$DefaultState,parent=null
1 StaEnabledState state=Controller$StaEnabledState,parent=Controller$DefaultState
2 DeviceInactiveState state=Controller$DeviceInactiveState,parent=Controller$StaEnabledState
=============================================
processMsg: Controller$DeviceInactiveState
ScanOnlyLockHeldState -->enter()
狀態棧中存在4個狀態分別爲
msg = 5
0 DefaultState state=Controller$DefaultState,parent=null
1 StaEnabledState state=Controller$StaEnabledState,parent=Controller$DefaultState
2 DeviceInactiveState state=Controller$DeviceInactiveState,parent=Controller$StaEnabledState
3 ScanOnlyLockHeldState state=Controller$ScanOnlyLockHeldState,parent=Controller$DeviceInactiveState
=============================================
processMsg: Controller$ScanOnlyLockHeldState
processMsg: Controller$DeviceInactiveState
invokeExitMethods: Controller$ScanOnlyLockHeldState
ScanOnlyLockHeldState -->exit()
FullLockHeldState -->enter()
狀態棧中存在4個狀態分別爲
msg = 6
0 DefaultState state=Controller$DefaultState,parent=null
1 StaEnabledState state=Controller$StaEnabledState,parent=Controller$DefaultState
2 DeviceInactiveState state=Controller$DeviceInactiveState,parent=Controller$StaEnabledState
3 FullLockHeldState state=Controller$FullLockHeldState,parent=Controller$DeviceInactiveState
=============================================
processMsg: Controller$FullLockHeldState
processMsg: Controller$DeviceInactiveState
invokeExitMethods: Controller$FullLockHeldState
FullLockHeldState -->exit()
FullHighPerfLockHeldState -->enter()
狀態棧中存在4個狀態分別爲
msg = 7
0 DefaultState state=Controller$DefaultState,parent=null
1 StaEnabledState state=Controller$StaEnabledState,parent=Controller$DefaultState
2 DeviceInactiveState state=Controller$DeviceInactiveState,parent=Controller$StaEnabledState
3 FullHighPerfLockHeldState state=Controller$FullHighPerfLockHeldState,parent=Controller$DeviceInactiveState
=============================================
processMsg: Controller$FullHighPerfLockHeldState
processMsg: Controller$DeviceInactiveState
invokeExitMethods: Controller$FullHighPerfLockHeldState
FullHighPerfLockHeldState -->exit()
NoLockHeldState -->enter()
狀態棧中存在4個狀態分別爲
msg = 8
0 DefaultState state=Controller$DefaultState,parent=null
1 StaEnabledState state=Controller$StaEnabledState,parent=Controller$DefaultState
2 DeviceInactiveState state=Controller$DeviceInactiveState,parent=Controller$StaEnabledState
3 NoLockHeldState state=Controller$NoLockHeldState,parent=Controller$DeviceInactiveState
=============================================
processMsg: Controller$NoLockHeldState
processMsg: Controller$DeviceInactiveState
processMsg: Controller$StaEnabledState
processMsg: Controller$DefaultState
invokeExitMethods: Controller$NoLockHeldState
NoLockHeldState -->exit()
invokeExitMethods: Controller$DeviceInactiveState
DeviceInactiveState -->exit()
invokeExitMethods: Controller$StaEnabledState
StaEnabledState -->exit()
StaDisabledWithScanState -->enter()
狀態棧中存在2個狀態分別爲
msg = 9
0 DefaultState state=Controller$DefaultState,parent=null
1 StaDisabledWithScanState state=Controller$StaDisabledWithScanState,parent=Controller$DefaultState
=============================================
processMsg: Controller$StaDisabledWithScanState
processMsg: Controller$DefaultState
invokeExitMethods: Controller$StaDisabledWithScanState
StaDisabledWithScanState -->exit()
ApEnabledState -->enter()
狀態棧中存在2個狀態分別爲
msg = 10
0 DefaultState state=Controller$DefaultState,parent=null
1 ApEnabledState state=Controller$ApEnabledState,parent=Controller$DefaultState
=============================================
processMsg: Controller$ApEnabledState
processMsg: Controller$DefaultState
invokeExitMethods: Controller$ApEnabledState
ApEnabledState -->exit()
EcmState -->enter()
狀態棧中存在2個狀態分別爲
msg = 11
0 DefaultState state=Controller$DefaultState,parent=null
1 EcmState state=Controller$EcmState,parent=Controller$DefaultState
=============================================
processMsg: Controller$EcmState
processMsg: Controller$DefaultState
狀態棧中存在2個狀態分別爲
msg = 12
0 DefaultState state=Controller$DefaultState,parent=null
1 EcmState state=Controller$EcmState,parent=Controller$DefaultState
=============================================
public class State {
public void enter() {
// donothing
}
public void exit() {
// donothing
}
protected State() {
}
public boolean processMessage(int msg) {
return false;
}
public String getName() {
return this.getClass().getName();
}
}
/*
*
addState(mDefaultState);
addState(mApStaDisabledState, mDefaultState);
addState(mStaEnabledState, mDefaultState);
addState(mDeviceActiveState, mStaEnabledState);
addState(mDeviceInactiveState, mStaEnabledState);
addState(mScanOnlyLockHeldState, mDeviceInactiveState);
addState(mFullLockHeldState, mDeviceInactiveState);
addState(mFullHighPerfLockHeldState, mDeviceInactiveState);
addState(mNoLockHeldState, mDeviceInactiveState);
addState(mStaDisabledWithScanState, mDefaultState);
addState(mApEnabledState, mDefaultState);
addState(mEcmState, mDefaultState);
*/
import java.util.HashMap;
public class StateMechine {
public int mStateStackTopIndex ;
public StateInfo mStateStack[];
public State mDestState;
public int mTempStateStackCount;
public HashMap<State, StateInfo> mStateInfo = new HashMap<State, StateInfo>();
public StateInfo mTempStateStack[];
public boolean mTransitionInProgress = false;
public StateMechine() {
// TODO Auto-generated constructor stub
mTempStateStackCount = 0;
mStateStackTopIndex = -1;
}
public void handleMessage(int msg) {
State msgProcessedState = null;
msgProcessedState = processMsg(msg); // 執行消息的處理 最終會執行到 狀態類的ProcessMessage
performTransitions(msgProcessedState, msg); // 執行狀態的切換
showState(msg);
}
public void showState(int msg) {
System.out.println("狀態棧中存在"+(mStateStackTopIndex+1)+"個狀態分別爲");
System.out.println("msg = "+ msg);
int i = 0;
// System.out.println("數組長度爲:"+mStateStack.length);
// if(mStateStack[0] == null){
// System.out.println("fuck0");
// }
//
// if(mStateStack[1] == null){
// System.out.println("fuck0");
// }
while( (i <= mStateStackTopIndex) && (mStateStack[i] != null) ){
mStateStack[i].getClass().getSimpleName();
System.out.println(i+ " "+mStateStack[i].state.getClass().getSimpleName() + " " +mStateStack[i].toString());
i++;
}
}
/*總結:
* 1. processMsg 是消息處理的函數,在該函數內部,會依次遍歷當前狀態StateInfo mStateStack[]數組中
* 的每一個狀態State定義的 processMessage方法,依次從樹頂State 遍歷到 樹根State,processMessage函數
* 返回true,那麼就說明 這個消息被這個狀態處理了。processMsg 會返回processMessage 處理msg爲true的那個樹節點
* 1.1 消息的處理一般會引起狀態State的切換,在ProcessMessage中會把 記錄當前樹頂狀態的切換爲需要切換到的
* 目的狀態 mDestState.
* processMsg 完成兩件事
* 一:在當前狀態棧mStateStack中通過
* 函數while (!curStateInfo.state.processMessage(msg)) {curStateInfo = curStateInfo.parentStateInfo;}
* 找到數組中處理msg 並返回爲true的那個 StateInfo 【對應找到 State msgProcessedState】
* 二: 在 處理msg 並返回爲true的那個 StateInfo的ProcessMessage方法中 會觸發狀態的切換 既通過方法
* mDestState = (State) destState; 找到對應的 【對應找到 State mDestState】
*
*
*
* 2.performTransitions 是狀態進行切換的操作函數,涉及到Map<State, StateInfo> 能通過這個Map拿到目標狀態的棧結構,
* 正式狀態數組StateInfo mStateStack[] 及長度 mStateStackTopIndex
* StateInfo mTempStateStack[] 臨時保存需要入棧的狀態的數組 及長度 mTempStateStackCount,
* State mDestState 目標狀態, StateInfo.active 是否在正式數組 mStateStack內bool標記
* 來完成切換狀態時 從StateInfo mStateStack[]數組 執行退出exit,
* 把新的StateInfo mTempStateStack[] 加入StateInfo mStateStack[] 執行 enter 方法的過程
* */
/*mStateStack 是一個結點的數組,這個數組裏面裝了當前StateInfo的結點對應關係
* 它的大小是通過計算最深層級關係得到的
*
*
* mStateStackTopIndex 是記錄StateInfo的結點在數組中最大的位置
*
* */
private State processMsg(int msg) {
StateInfo curStateInfo = mStateStack[mStateStackTopIndex];
System.out.println("processMsg: " + curStateInfo.state.getName());
while (!curStateInfo.state.processMessage(msg)) {
curStateInfo = curStateInfo.parentStateInfo;
if (curStateInfo == null) {
break;
}
System.out.println("processMsg: " + curStateInfo.state.getName());
}
return (curStateInfo != null) ? curStateInfo.state : null;
}
/*mStateStack 是一個結點的數組,這個數組裏面裝了當前StateInfo的結點對應關係
* 它的大小是通過計算最深層級關係得到的
*
*
* mStateStackTopIndex 是記錄StateInfo的結點在數組中最大的位置
*
* */
private void performTransitions(State msgProcessedState, int msg) {
State orgState = mStateStack[mStateStackTopIndex].state; // 就的狀態棧棧頂
State destState = mDestState; // 新的狀態棧 需要的頂
if (destState != null) {
while (true) {
// 執行之前狀態的 exit方法 執行新進入狀態的enter方法
StateInfo commonStateInfo = setupTempStateStackWithStatesToEnter(destState);
invokeExitMethods(commonStateInfo);
int stateStackEnteringIndex = moveTempStateStackToStateStack();
invokeEnterMethods(stateStackEnteringIndex);
if (destState != mDestState) {
destState = mDestState;
} else {
break;
}
}
}
mDestState = null;
}
public void transitionTo(State destState) {
//System.out.println("transitionTo called while transition already in progress to " + mDestState + ", new target state=" + destState);
mDestState = (State) destState; // 就是把目標變量mDestState 變爲當前的狀態,後續執行enter方法
//System.out.println("transitionTo: destState=" + mDestState.getName());
}
public void completeConstruction(State state) {
int maxDepth = 0;
for (StateInfo si : mStateInfo.values()) {
int depth = 0;
for (StateInfo i = si; i != null; depth++) {
i = i.parentStateInfo;
}
if (maxDepth < depth) {
maxDepth = depth;
}
}
// 遍歷 HashMap<State, StateInfo>(); 依次回溯父類 得到最多父類的就是最深的長度
mStateStack = new StateInfo[maxDepth];
mTempStateStack = new StateInfo[maxDepth];
mStateStackTopIndex = 0;
mStateInfo.get(state).active = true;
mStateStack[mStateStackTopIndex] = mStateInfo.get(state);
}
//臨時數組 mTempStateStack[] 和正式數組mStateStack[] 之間邏輯處理 使得mStateStack[] 集合重新填充
private final int moveTempStateStackToStateStack() {
// 從已經處理了離開的StateInfo數組 重新構建新的數組
int startingIndex = mStateStackTopIndex + 1;
//臨時StateInfo數組的長度 StateInfo StateInfo.parent StateInfo.parent.parent
int i = mTempStateStackCount - 1;
int j = startingIndex;
while (i >= 0) {
//System.out.println("moveTempStackToStateStack: i=" + i + ",j=" + j);
//把在臨時StateInfo數組mTempStateStack中的StateInfo 依次加入到正式的記錄StateInfo數組
//加入的順序是 臨時數組mTempStateStack的最後一個StateInfo加入到正式StateInfo數組頂部
//... 臨時數組mTempStateStack的第一個StateInfo最終變爲正式StateInfo數組的頂部
mStateStack[j] = mTempStateStack[i];
j += 1;
i -= 1;
}
mStateStackTopIndex = j - 1; // 記錄正式數組的位置
//System.out.println("moveTempStackToStateStack: X mStateStackTop=" + mStateStackTopIndex + ",startingIndex="+ startingIndex + ",Top=" + mStateStack[mStateStackTopIndex].state.getName());
return startingIndex;
}
// 對mStateStack 中的StateInfo數組 進行遍歷 依次排除掉直到 當前狀態是 commonStateInfo
private final void invokeExitMethods(StateInfo commonStateInfo) {
while ((mStateStackTopIndex >= 0) && (mStateStack[mStateStackTopIndex] != commonStateInfo)) {
State curState = mStateStack[mStateStackTopIndex].state;
System.out.println("invokeExitMethods: " + curState.getName());
curState.exit(); // 執行從 mStateStack StateInfo 數組離開的狀態State的exit方法
mStateStack[mStateStackTopIndex].active = false; // 記錄當前StateInfo 不在棧中了
mStateStackTopIndex -= 1;
}
}
private final void invokeEnterMethods(int stateStackEnteringIndex) {
// 在新構建的數組 mStateStack 以stateStackEnteringIndex起點 mStateStackTopIndex爲終點
// 執行這些狀態的 enter() 方法
for (int i = stateStackEnteringIndex; i <= mStateStackTopIndex; i++) {
if (stateStackEnteringIndex == mStateStackTopIndex) {
// Last enter state for transition
mTransitionInProgress = false;
}
mStateStack[i].state.enter(); // 執行狀態的 enter 方法
mStateStack[i].active = true; // 記錄當前State是在 棧中了
}
mTransitionInProgress = false;
}
private StateInfo setupTempStateStackWithStatesToEnter(State destState) {
mTempStateStackCount = 0;
// 從HashMap獲得目標狀態destState 對應的結點 StateInfo
StateInfo curStateInfo = mStateInfo.get(destState);
do {
// 構建以destState爲起始的 最父類在最後的 臨時 StateInfo數組
mTempStateStack[mTempStateStackCount++] = curStateInfo;
curStateInfo = curStateInfo.parentStateInfo;
// 循環到父節點爲空 或者當前的這個結點已經到棧中了 滿足一個 退出循while環
} while ((curStateInfo != null) && (!curStateInfo.active));
return curStateInfo;
}
private class StateInfo {
State state;
StateInfo parentStateInfo;
/** True when the state has been entered and on the stack */
boolean active;
@Override
public String toString() {
return "state=" + state.getName() + ",parent="
+ ((parentStateInfo == null) ? "null" : parentStateInfo.state.getName());
}
}
public StateInfo addState(State state, State parent) {
//System.out.println("addStateInternal: E state=" + state.getName() + ",parent=" + ((parent == null) ? "" : parent.getName()));
StateInfo parentStateInfo = null;
if (parent != null) {
parentStateInfo = mStateInfo.get(parent);
if (parentStateInfo == null) {
// Recursively add our parent as it's not been added yet.
parentStateInfo = addState(parent, null);
}
}
StateInfo stateInfo = mStateInfo.get(state);
if (stateInfo == null) {
stateInfo = new StateInfo();
mStateInfo.put(state, stateInfo); // 完成MAP的數據填充
}
// Validate that we aren't adding the same state in two different hierarchies.
if ((stateInfo.parentStateInfo != null)
&& (stateInfo.parentStateInfo != parentStateInfo)) {
throw new RuntimeException("state already added");
}
stateInfo.state = state;
stateInfo.parentStateInfo = parentStateInfo; // 完成父子關係的方法
stateInfo.active = false;
//System.out.println("addStateInternal: X stateInfo: " + stateInfo);
return stateInfo;
}
private void removeState(State state) { // 從Map移除
StateInfo stateInfo = mStateInfo.get(state);
if (stateInfo == null || stateInfo.active) {
return;
}
boolean isParent = mStateInfo.values().stream()
.filter(si -> si.parentStateInfo == stateInfo)
.findAny()
.isPresent();
if (isParent) {
return;
}
mStateInfo.remove(state);
}
private State getCurrentState() {
return mStateStack[mStateStackTopIndex].state;
}
}
public class Controller extends StateMechine{
public static void main(String[] args) throws InterruptedException {
Controller ctro = new Controller();
for (int i = 1; i < 13; i++) {
ctro.handleMessage(i);
System.out.println("=============================================");
Thread.sleep(3000);
}
}
DefaultState mDefaultState;
ApStaDisabledState mApStaDisabledState;
StaEnabledState mStaEnabledState;
DeviceActiveState mDeviceActiveState;
DeviceInactiveState mDeviceInactiveState;
ScanOnlyLockHeldState mScanOnlyLockHeldState;
FullLockHeldState mFullLockHeldState;
FullHighPerfLockHeldState mFullHighPerfLockHeldState;
NoLockHeldState mNoLockHeldState;
StaDisabledWithScanState mStaDisabledWithScanState;
ApEnabledState mApEnabledState;
EcmState mEcmState;
public Controller() {
mDefaultState = new DefaultState();
mApStaDisabledState = new ApStaDisabledState();
mStaEnabledState = new StaEnabledState();
mDeviceActiveState = new DeviceActiveState();
mDeviceInactiveState = new DeviceInactiveState();
mScanOnlyLockHeldState = new ScanOnlyLockHeldState();
mFullLockHeldState = new FullLockHeldState();
mFullHighPerfLockHeldState = new FullHighPerfLockHeldState();
mNoLockHeldState = new NoLockHeldState();
mStaDisabledWithScanState = new StaDisabledWithScanState();
mApEnabledState = new ApEnabledState();
mEcmState = new EcmState();
addState(mDefaultState,null);
addState(mApStaDisabledState, mDefaultState);
addState(mStaEnabledState, mDefaultState);
addState(mDeviceActiveState, mStaEnabledState);
addState(mDeviceInactiveState, mStaEnabledState);
addState(mScanOnlyLockHeldState, mDeviceInactiveState);
addState(mFullLockHeldState, mDeviceInactiveState);
addState(mFullHighPerfLockHeldState, mDeviceInactiveState);
addState(mNoLockHeldState, mDeviceInactiveState);
addState(mStaDisabledWithScanState, mDefaultState);
addState(mApEnabledState, mDefaultState);
addState(mEcmState, mDefaultState);
completeConstruction(mDefaultState);
}
//============================================
class DefaultState extends State {
@Override
public void exit() {
// TODO Auto-generated method stub
System.out.println("DefaultState-->exit() ");
super.exit();
}
@Override
public void enter() {
// TODO Auto-generated method stub
System.out.println("DefaultState-->enter()");
super.enter();
}
@Override
public boolean processMessage(int msg) {
switch (msg) {
case 1:
transitionTo(mApStaDisabledState);
return true;
case 2:
transitionTo(mStaEnabledState);
return true;
case 9:
transitionTo(mStaDisabledWithScanState);
return true;
case 10:
transitionTo(mApEnabledState);
return true;
case 11:
transitionTo(mEcmState);
return true;
default:
break;
}
return super.processMessage(msg);
}
}
//============================================
class ApStaDisabledState extends State {
@Override
public void exit() {
// TODO Auto-generated method stub
System.out.println("ApStaDisabledState-->exit() ");
super.exit();
}
@Override
public void enter() {
// TODO Auto-generated method stub
System.out.println("ApStaDisabledState-->enter()");
super.enter();
}
@Override
public boolean processMessage(int msg) {
// TODO Auto-generated method stub
return super.processMessage(msg);
}
}
//============================================
class StaEnabledState extends State {
@Override
public void exit() {
// TODO Auto-generated method stub
System.out.println("StaEnabledState -->exit() ");
super.exit();
}
@Override
public void enter() {
// TODO Auto-generated method stub
System.out.println("StaEnabledState -->enter()");
super.enter();
}
@Override
public boolean processMessage(int msg) {
switch (msg) {
case 3:
transitionTo(mDeviceActiveState);
return true;
case 4:
transitionTo(mDeviceInactiveState);
return true;
default:
break;
}
return super.processMessage(msg);
}
}
//============================================
class StaDisabledWithScanState extends State {
@Override
public void exit() {
// TODO Auto-generated method stub
System.out.println("StaDisabledWithScanState -->exit() ");
super.exit();
}
@Override
public void enter() {
// TODO Auto-generated method stub
System.out.println("StaDisabledWithScanState -->enter()");
super.enter();
}
@Override
public boolean processMessage(int msg) {
// TODO Auto-generated method stub
return super.processMessage(msg);
}
}
//============================================
class ApEnabledState extends State {
@Override
public void exit() {
// TODO Auto-generated method stub
System.out.println("ApEnabledState -->exit() ");
super.exit();
}
@Override
public void enter() {
// TODO Auto-generated method stub
System.out.println("ApEnabledState -->enter()");
super.enter();
}
@Override
public boolean processMessage(int msg) {
// TODO Auto-generated method stub
return super.processMessage(msg);
}
}
//============================================
class EcmState extends State {
@Override
public void exit() {
// TODO Auto-generated method stub
System.out.println("EcmState -->exit() ");
super.exit();
}
@Override
public void enter() {
// TODO Auto-generated method stub
System.out.println("EcmState -->enter()");
super.enter();
}
@Override
public boolean processMessage(int msg) {
// TODO Auto-generated method stub
return super.processMessage(msg);
}
}
//============================================
class DeviceActiveState extends State {
@Override
public void exit() {
// TODO Auto-generated method stub
System.out.println("DeviceActiveState -->exit() ");
super.exit();
}
@Override
public void enter() {
// TODO Auto-generated method stub
System.out.println("DeviceActiveState -->enter()");
super.enter();
}
@Override
public boolean processMessage(int msg) {
return super.processMessage(msg);
}
}
//============================================
class DeviceInactiveState extends State {
@Override
public void exit() {
// TODO Auto-generated method stub
System.out.println("DeviceInactiveState -->exit() ");
super.exit();
}
@Override
public void enter() {
// TODO Auto-generated method stub
System.out.println("DeviceInactiveState -->enter()");
super.enter();
}
@Override
public boolean processMessage(int msg) {
switch (msg) {
case 5:
transitionTo(mScanOnlyLockHeldState);
return true;
case 6:
transitionTo(mFullLockHeldState);
return true;
case 7:
transitionTo(mFullHighPerfLockHeldState);
return true;
case 8:
transitionTo(mNoLockHeldState);
return true;
default:
break;
}
return super.processMessage(msg);
}
}
//============================================
class ScanOnlyLockHeldState extends State {
@Override
public void exit() {
// TODO Auto-generated method stub
System.out.println("ScanOnlyLockHeldState -->exit() ");
super.exit();
}
@Override
public void enter() {
// TODO Auto-generated method stub
System.out.println("ScanOnlyLockHeldState -->enter()");
super.enter();
}
@Override
public boolean processMessage(int msg) {
// TODO Auto-generated method stub
return super.processMessage(msg);
}
}
//============================================
class FullLockHeldState extends State {
@Override
public void exit() {
// TODO Auto-generated method stub
System.out.println("FullLockHeldState -->exit() ");
super.exit();
}
@Override
public void enter() {
// TODO Auto-generated method stub
System.out.println("FullLockHeldState -->enter()");
super.enter();
}
@Override
public boolean processMessage(int msg) {
// TODO Auto-generated method stub
return super.processMessage(msg);
}
}
//============================================
class FullHighPerfLockHeldState extends State {
@Override
public void exit() {
// TODO Auto-generated method stub
System.out.println("FullHighPerfLockHeldState -->exit() ");
super.exit();
}
@Override
public void enter() {
// TODO Auto-generated method stub
System.out.println("FullHighPerfLockHeldState -->enter()");
super.enter();
}
@Override
public boolean processMessage(int msg) {
// TODO Auto-generated method stub
return super.processMessage(msg);
}
}
//============================================
class NoLockHeldState extends State {
@Override
public void exit() {
// TODO Auto-generated method stub
System.out.println("NoLockHeldState -->exit() ");
super.exit();
}
@Override
public void enter() {
// TODO Auto-generated method stub
System.out.println("NoLockHeldState -->enter()");
super.enter();
}
@Override
public boolean processMessage(int msg) {
// TODO Auto-generated method stub
return super.processMessage(msg);
}
}
}