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

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

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

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

 

于是,笨木头有笨方法~

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

来,看看:

 

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) {
			}
		}
	}


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

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

来,听听我的做法:

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. 没了~完毕~

 

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

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

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

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

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值