用一個線程模擬多個線程,減少線程數量

遊戲開發中,免不瞭有很多定時任務、動畫效果。
這些不是在一次的流程中就能執行完畢的。
正常情況下,我會想到用線程,但是,這麼多定時任務,這麼多動畫效果,哪能這麼多線程呢?~
 
於是,笨木頭有笨方法~
自己模擬一下多線程就好瞭嘛~不就間隔一段時間執行一個函數麼,簡單~
來,看看:
 
[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. 沒瞭~完畢~
 
哎吖~我知道,這個方法也許早就有瞭~
但是,但是~這是我自己領悟的~沒有看任何書籍,沒有看任何文章~沒有問任何人~
就是在開發過程中領悟的~噢~不行,你們一定要贊我~
好吧,不贊就…不贊咯…

摘自 笨木頭

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。