状态机编程实例及适用范围
状态机编程实例及适用范围
简介
状态机编程思想特点
状态机编程实例
int sum = 0;
for(int i = 1;i <= 100;i++)
{sum+=i;
}
System.out.println(sum);
接下来看看状态机编程是如何解决同一个问题的:
int status = 0;int sum = 0;int i = 1;while(status != -1){switch(status){case 0:{if(i <= 100){sum+=i;i++;}else{status = 1;}}break;case 1:{System.out.println(sum);status = -1;}break;}}
状态 | 状态概括 | 行为描述 | 状态转换关系 |
0 | 加法状态 | 将sum的值加i,将i自加 | 若i大于100,则跳入状态1 |
1 | 输出状态 | 将sum的值输出 | 跳转到状态-1 |
-1 | 终止状态 | 程序结束 | 无 |
状态机编程思想的适用范围
public void play(InputStream mediaFileInputStream);//播放音频文件
public void stop();//关闭音频文件
public void pasue();//暂停播放
public void resume();//继续播放
API的设计不是很困难,现在考虑这样的问题,这个模块必须足够强大,对一些非法操作进行足够的容错处理,例如在关闭的情况下再次关闭,或者在关闭后继续播放等等的调用都要考虑,这时,使用原来“上下文”流水式的编程思想就会很麻烦了,我们看一下它的状态设计:
状态(enum) | 状态概括 | 行为叙述 | 状态转换关系 |
CLOSE | 停止状态 | 无行为 | 可跳转至播放状态 |
PLAYING | 播放状态 | 从给定缓冲区读取音频byte组,写入设备,若遇到结尾则跳转到CLOSE | 可跳转到停止或暂停状态 |
WAIT | 暂停状态 | 无行为 | 可跳转回播放状态 |
TERM | 终止状态 | 终止模块任务 结束线程 |
之后是编写的源文件(伪代码):
public class MediaPlayer extends Thread
{SoundDevice soundDevice;//抽象的播放设备byte[] buffer;//音频数据缓存InputStream is;//音频文件流(代指数据源)MediaStatus status = MediaStatus.CLOSE;public enum MediaStatus{PLAYING,WAIT,CLOSE,TERM}//播放音频public void play(InputStream mediaFileInputStream){if(status == MediaStatus.CLOSE){synchronized(is){is = mediaFileInputStream;status = MediaStatus.PLAYING;}}}//关闭音频文件public void stop(){if(status == MediaStatus.PLAYING){synchronized(is){is.close();status = MediaStatus.CLOSE;}}}//暂停播放public void pasue(){if(status == MediaStatus.PLAYING){status = MediaStatus.WAIT;}}//继续播放public void resume(){if(status == MediaStatus.WAIT){status = MediaStatus.PLAYING;}}@Overridepublic void run(){while(status != MediaStatus.TERM){synchronized(is){switch(status){case PLAYING:{if(0 != is.read(buffer)){soundDevice.write(buffer);}else{is.close();status = MediaStatus.CLOSE;}}break;case WAIT:{}case CLOSE:{}default:{Thread.sleep(30)}break;//不要让线程空跑}}}}
}
状态机编程实例及适用范围相关推荐
- STM32状态机编程实例——全自动洗衣机(上)
前面几篇文章,以按键功能,介绍了状态机的原理与按键状态机实例,实现按键单击.双击.长按等状态的检测. 本篇,继续使用状态机编程,来实现一个更有趣的功能--全自动洗衣机. 1 全自动洗衣机功能分析 下面 ...
- 排线电机运行控制(梯形图状态机编程)
这篇博客主要分析排线电机的逻辑时序动作控制,有关排线电机的速度控制(比例随动编程应用)可以参看相关的文章,有详细算法和源代码分析: 绕线机-排线伺服速度解算FC(比例随动编程应用)_RXXW_Dor的 ...
- Python并发编程实例教程
有关Python中的并发编程实例,主要是对Threading模块的应用,文中自定义了一个Threading类库. 一.简介 我们将一个正在运行的程序称为进程.每个进程都有它自己的系统状态,包含内存状态 ...
- iOS网络编程-iCloud键值数据存储编程实例
iCloud键值数据存储设计 iCloud键值数据存储编程实例,画面中有两个开关控件,左图是设备1点击"设置iCloud数据"按钮,将控件状态保存到iCloud服务器.右图是设备2 ...
- NIO Socket编程实例
1.阻塞模式实例 NIOUtil类,用来通过SOcket获取BufferedReader和PrintWriter. package IO;import java.io.BufferedReader; ...
- linux c编程项目实例,Linux c编程实例_例子
例一:字符与整型变量的实现 #include int main() { int c1,c2; char c3; c1='a'-'A'; c2='b'-'B'; c3='c'-; printf(&quo ...
- C#中Socket多线程编程实例
C#是微软随着VS.net新推出的一门语言.它作为一门新兴的语言,有着C++的强健,又有着VB等的RAD特性.而且,微软推出C#主要的目的是为了对抗Sun公司的Java.大家都知道Java语言的强大功 ...
- 《突破C#编程实例五十讲》源文件下载(2)
上接<<突破C#编程实例五十讲>源文件下载(1)> 有兴趣的朋友下载看看吧,一共有9个压缩包分3篇文章,下载要注意哦,不然解压要出错哦! 转载于:https://blog.51 ...
- java编程50实例_java编程实例大全及详解谜底(50例).doc
java编程实例大全及详解谜底(50例).doc 还剩 33页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: 谓 ...
- Hadoop Streaming编程实例
Hadoop Streaming是Hadoop提供的多语言编程工具,通过该工具,用户可采用任何语言编写MapReduce程序,本文将介绍几个Hadoop Streaming编程实例,大家可重点从以下几 ...
最新文章
- 5月第4周网络安全报告:应用程序漏洞占比达70.3%
- 逆向工程核心原理读书笔记-API钩取之记事本小写转大写
- SAP云平台与企业数字型转型
- OpenGL中shader使用
- Linux中拷贝和移动文件
- LING与HQL(三)
- 初步使用计算机学设计,幼儿园计算机教学设计参考
- 用iostat对linux硬盘IO性能进行检测
- 关于中国互联网的国际出口-转载
- 圆柱体积怎么算立方公式_圆柱体积怎么算立方 高为3米则此圆柱的体积为27
- 工信部:将于近期发放5G商用牌照
- 历史时点数据统计如何设计表结构_如何做好调薪管理?年度调薪的操作方式
- 开机黑屏显示html,电脑开机黑屏只显示光标怎么办?来看看几种原因分析及解决方法!...
- 大数据行业前景_大数据未来展望
- 计算机安装Hp1005打印机,hp1005打印机安装方法
- 【小白练习】一元二次方程计算器
- 送书 | 《Django项目开发实战》
- 罗永浩的1.1亿,薇娅的卖火箭,蛋蛋的4.8亿,直播魔幻夜埋下了什么
- 一篇讲autoconf/automake的好文章
- 如何生成股票的macd指标