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

游戏开发中,免不了有很多定时任务、动画效果。

这些不是在一次的流程中就能执行完毕的。

正常情况下,我会想到用线程,但是,这么多定时任务,这么多动画效果,哪能这么多线程呢?~

 

于是,笨木头有笨方法~

自己模拟一下多线程就好了嘛~不就间隔一段时间执行一个函数么,简单~

来,看看:

 

[java]  view plain copy print ?
  1. public class GameEventThread extends Thread {  
  2.     private final String TAG = "GameEventThread";  
  3.       
  4.     private int SLEEP_TIME = 10;      
  5.       
  6.     /* 注意咯,A_GameEvent是一个事件类,就是用来模拟子线程的 */private ArrayList<A_GameEvent> gameEventList = new  ArrayList<A_GameEvent>();  
  7.   
  8.   
  9.   
  10.   
  11.       
  12.     private boolean isRun = true;  
  13.       
  14.     public GameEventThread(String threadName) {  
  15.         super(threadName);  
  16.     }  
  17.       
  18.     public GameEventThread(String threadName, int iSleepTime) {  
  19.         super(threadName);  
  20.         this.SLEEP_TIME = iSleepTime;  
  21.     }  
  22.   
  23.   
  24.     /** 
  25.      * 添加事件到线程的事件列表中 
  26.      * @param event 
  27.      */  
  28.     public void addGameEvent(A_GameEvent event) {  
  29.         if(gameEventList.contains(event) == false) {  
  30.             gameEventList.add(event);  
  31.         }  
  32.     }  
  33.       
  34.     public void stopRun() {  
  35.         this.isRun = false;  
  36.     }  
  37.       
  38.     @Override  
  39.     public void run() {  
  40.         Iterator<A_GameEvent> iter = null;  
  41.         A_GameEvent event = null;  
  42.           
  43.         while(isRun) {  
  44.             /* 遍历事件列表 */  
  45.             try {  
  46.                 iter = gameEventList.iterator();  
  47.                 while(iter.hasNext()) {  
  48.                     event = iter.next();  
  49.                       
  50.                     /* 事件存活 */  
  51.                     if(event.isAlive()) {  
  52.                         /* 到达事件执行时间 */  
  53.                         if(event.isAtTheTime()) {  
  54.                             event.doEvent();  
  55.                         }  
  56.                     }  
  57.                     else {  
  58.                         /* 事件已经不存活,删除该事件 */  
  59.                         iter.remove();  
  60.                     }  
  61.                 }  
  62.             } catch (ConcurrentModificationException e1) {  
  63.             }  
  64.               
  65.             try {  
  66.                 Thread.sleep(SLEEP_TIME);  
  67.             } catch (InterruptedException e) {  
  68.             }  
  69.         }  
  70.     }  


这是一个线程,要做的工作很简单,就是不断遍历事件列表,发现某个事件到达了执行时间,就执行该事件的回调函数~

那,那,你是不是很想问我,怎么判断事件达到了执行时间呢?~

来,听听我的做法:

[java]  view plain copy print ?
  1. public abstract class A_GameEvent implements I_GameEvent {  
  2.     protected boolean isAlive = true;  
  3.     private long startTime = 0;  
  4.     private int iSleepTime = 0;  
  5.       
  6.     public A_GameEvent(int _iSleepTime) {  
  7.         this.iSleepTime = _iSleepTime;  
  8.           
  9.         refreshStartTime();  
  10.     }  
  11.       
  12.     /* 记录开始时间 */      
  13.     public void refreshStartTime() {  
  14.         startTime = System.currentTimeMillis();  
  15.     }  
  16.   
  17.       
  18.     /* 判断是否达到了时间间隔: 当前时间 - 开始时间 大于 休眠时间 */    
  19.     public boolean isAtTheTime() {  
  20.         long endTime =  System.currentTimeMillis();  
  21.         long span = endTime - startTime;  
  22.           
  23.         if(span >= iSleepTime) {  
  24.             startTime = endTime;  
  25.             return true;  
  26.         }  
  27.         return false;  
  28.     }  
  29.       
  30.     /* isAlive标记事件是否存活,如果事件不存活,就会被kill掉 */  
  31.     public void setisAlive(boolean isAlive) {  
  32.         this.isAlive = isAlive;  
  33.     }  
  34. }  


怎么样?很简单吧?当前时间减去添加事件时的时间,如果这个时间大于我们设定的事件休眠时间,就执行该事件~

 

喂~!等等,你怎么不问我I_GameEvent接口是什么?

嘿嘿,是这个:

[java]  view plain copy print ?
  1. public interface I_GameEvent {  
  2.     public void doEvent();      // 执行操作  
  3.     public boolean isAlive();       // 判断该操作是否存活  
  4. }  


简单~不解释~

 

再来理一遍~

1. 有很多个事件类,事件类有一个开始时间,还有休眠时间。

2. 有一个全局线程,不断遍历一个事件列表。

3. 当前时间 - 事件开始时间 大于等于 事件的休眠时间,则执行事件。

4. 没了~完毕~

 

哎吖~我知道,这个方法也许早就有了~

但是,但是~这是我自己领悟的~没有看任何书籍,没有看任何文章~没有问任何人~

就是在开发过程中领悟的~噢~不行,你们一定要赞我~可怜

好吧,不赞就...不赞咯...委屈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值