灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2235回复:0

用一个线程模拟多个线程,减少线程数量

楼主#
更多 发布于:2012-09-06 13:53

游戏开发中,免不了有很多定时任务、动画效果。
这些不是在一次的流程中就能执行完毕的。
正常情况下,我会想到用线程,但是,这么多定时任务,这么多动画效果,哪能这么多线程呢?~

于是,笨木头有笨方法~
自己模拟一下多线程就好了嘛~不就间隔一段时间执行一个函数么,简单~
来,看看:

[java]
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;
    }
    
    @Override
    public 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) {
            }
        }
    }
这是一个线程,要做的工作很简单,就是不断遍历事件列表,发现某个事件到达了执行时间,就执行该事件的回调函数~
那,那,你是不是很想问我,怎么判断事件达到了执行时间呢?~
来,听听我的做法:
[java]
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接口是什么?
嘿嘿,是这个:
[java]
public interface I_GameEvent {
    public void doEvent();      // 执行操作
    public boolean isAlive();       // 判断该操作是否存活
}
简单~不解释~

再来理一遍~
1. 有很多个事件类,事件类有一个开始时间,还有休眠时间。
2. 有一个全局线程,不断遍历一个事件列表。
3. 当前时间 - 事件开始时间 大于等于 事件的休眠时间,则执行事件。
4. 没了~完毕~

哎吖~我知道,这个方法也许早就有了~
但是,但是~这是我自己领悟的~没有看任何书籍,没有看任何文章~没有问任何人~
就是在开发过程中领悟的~噢~不行,你们一定要赞我~
好吧,不赞就...不赞咯...




喜欢0 评分0
游客

返回顶部