用一个线程模拟多个线程,减少线程数量~
来源:互联网 发布:todolist mac 下载 编辑:程序博客网 时间:2024/04/28 15:31
游戏开发中,免不了有很多定时任务、动画效果。
这些不是在一次的流程中就能执行完毕的。
正常情况下,我会想到用线程,但是,这么多定时任务,这么多动画效果,哪能这么多线程呢?~
于是,笨木头有笨方法~
自己模拟一下多线程就好了嘛~不就间隔一段时间执行一个函数么,简单~
来,看看:
public class GameEventThread extends Thread {private final String TAG = "GameEventThread";private int SLEEP_TIME = 10;/* 注意咯,A_GameEvent是一个事件类,就是用来模拟子线程的 */private ArrayList<A_GameEvent> gameEventList = new ArrayList<A_GameEvent>();private boolean isRun = true;public GameEventThread(String threadName) {super(threadName);}public GameEventThread(String threadName, int iSleepTime) {super(threadName);this.SLEEP_TIME = iSleepTime;}/** * 添加事件到线程的事件列表中 * @param event */public void addGameEvent(A_GameEvent event) {if(gameEventList.contains(event) == false) {gameEventList.add(event);}}public void stopRun() {this.isRun = false;}@Overridepublic void run() {Iterator<A_GameEvent> iter = null;A_GameEvent event = null;while(isRun) {/* 遍历事件列表 */try {iter = gameEventList.iterator();while(iter.hasNext()) {event = iter.next();/* 事件存活 */if(event.isAlive()) {/* 到达事件执行时间 */if(event.isAtTheTime()) {event.doEvent();}}else {/* 事件已经不存活,删除该事件 */iter.remove();}}} catch (ConcurrentModificationException e1) {}try {Thread.sleep(SLEEP_TIME);} catch (InterruptedException e) {}}}
这是一个线程,要做的工作很简单,就是不断遍历事件列表,发现某个事件到达了执行时间,就执行该事件的回调函数~
那,那,你是不是很想问我,怎么判断事件达到了执行时间呢?~
来,听听我的做法:
public abstract class A_GameEvent implements I_GameEvent {protected boolean isAlive = true;private long startTime = 0;private int iSleepTime = 0;public A_GameEvent(int _iSleepTime) {this.iSleepTime = _iSleepTime;refreshStartTime();}/* 记录开始时间 */public void refreshStartTime() {startTime = System.currentTimeMillis();}/* 判断是否达到了时间间隔: 当前时间 - 开始时间 大于 休眠时间 */public boolean isAtTheTime() {long endTime = System.currentTimeMillis();long span = endTime - startTime;if(span >= iSleepTime) {startTime = endTime;return true;}return false;}/* isAlive标记事件是否存活,如果事件不存活,就会被kill掉 */public void setisAlive(boolean isAlive) {this.isAlive = isAlive;}}
怎么样?很简单吧?当前时间减去添加事件时的时间,如果这个时间大于我们设定的事件休眠时间,就执行该事件~
喂~!等等,你怎么不问我I_GameEvent接口是什么?
嘿嘿,是这个:
public interface I_GameEvent {public void doEvent();// 执行操作public boolean isAlive();// 判断该操作是否存活}
简单~不解释~
再来理一遍~
1. 有很多个事件类,事件类有一个开始时间,还有休眠时间。
2. 有一个全局线程,不断遍历一个事件列表。
3. 当前时间 - 事件开始时间 大于等于 事件的休眠时间,则执行事件。
4. 没了~完毕~
哎吖~我知道,这个方法也许早就有了~
但是,但是~这是我自己领悟的~没有看任何书籍,没有看任何文章~没有问任何人~
就是在开发过程中领悟的~噢~不行,你们一定要赞我~
好吧,不赞就...不赞咯...
- 用一个线程模拟多个线程,减少线程数量~
- 用一个线程模拟多个线程,减少线程数量~
- 线程-多个线程多个锁
- 在一个线程中产生多个线程
- 多个线程是否可以共用一个线程函数
- 进程 vs 线程 :一个进程可以包含多个线程
- 进程 vs 线程 :一个进程可以包含多个线程
- 减少线程占用cpu
- 线程的数量控制
- IOCP线程数量
- 线程数量控制
- 线程的数量
- 一个创建多个线程的实例
- 轻松使用线程: 减少争用
- 轻松使用线程: 减少争用
- 用一个线程池执行多个任务
- 多个线程多个锁
- lua 多个线程
- 《编程之美》中“小飞的电梯调度算法”停k层的解法
- NSURLConnection downlload RSS feed
- android R.java文件丢失或无法更新
- Linux中修改PATH环境变量(只在当前窗口下生效)
- php 调动java xfire参数错误
- 用一个线程模拟多个线程,减少线程数量~
- Linux -> usb-serial -> option.c 设备编译
- ES PS TS 流的区别
- Wijmo 更优美的jQuery UI部件集:通过jsFiddle测试Wijmo Gauges
- 求答案:org.springframework.beans.factory.BeanCreationException
- hibernate批量操作
- 研究记录02—EKF_SLAM ——2012.4 Joan Sola
- IBM HTTP Server Plugin默认plugin-key.kdb 密钥数据库文件默认个人证书密码过期分析与解决方法
- 用程序动态改变UITextField的键盘模式