前言
最近项目中需要对上传的接口进行顺序上传和步骤记录,所以这里编写一个状态机用例。
实战
public class StatusMachine {
//重点1:状态值是固定的写法
@Retention(RetentionPolicy.SOURCE)
public @interface Satus{
int STEP1 = 0x000001;
int STEP2 = 0x000002;
int STEP3 = 0x000004;
int STEP4 = 0x000008;
int STEP5 = 0x000010;
int STEP6 = 0x000020;
int STEP7 = 0x000040;
int STEP8 = 0x000080;
....
}
private int status;
/**
*
* 是否有此状态
*
* @param value 保存当前状态
*/
private boolean hase(int value) {
return (status & value) != 0;
}
/**
* 移除一个状态
*
* @param value
*/
private void remove(int value) {
status &= ~value;
}
/**
* 存储状态
* @param value
*/
private void add(int value) {
status |= value;
}
/**
* 清楚当前状态
*/
private void clear(){
status = 0;
}
public static void main(String[] args)
{
StatusMachine statusMachine = new StatusMachine();
//add
statusMachine.add(Satus.STEP1);
statusMachine.add(Satus.STEP2);
//remove
statusMachine.remove(Satus.STEP1);
//query
System.out.println("Step1 has:"+statusMachine.hase(Satus.STEP1));
System.out.println("Step2 has:"+statusMachine.hase(Satus.STEP2));
}
}

1.注意状态值的编写,状态从1248依次重复进位添加。
2.状态方法为增删查,使用语言计算符号进行计算判断。
用例
需求
假如我们有一个后台常驻服务用于循环执行任务。记录每一个执行过的步骤,若中途中断,下次任务循环不执行当前进度中所执行的任务。
main{
while (true) {
if (!statusMachine.hase(Status.STEP1)) {
//do step1....
statusMachine.add(Status.STEP1);
}
if (!statusMachine.hase(Status.STEP2)) {
//do step2....
statusMachine.add(Status.STEP2);
}
//...
if (!statusMachine.hase(Status.FINISH)){
statusMachine.clear();
break;
}
}
}
本文介绍了一种使用状态机实现循环任务进度控制的方法,通过定义固定状态值和实现增删查操作,确保任务在中断后能从正确的步骤继续执行。
578

被折叠的 条评论
为什么被折叠?



