用JAVA写了一个定时器类,此类作为一个线程运行,包含了一个队列存放定时器消息,通过比较定时器的触发时间,俺触发事件先后顺序排列队列。
import
java.util.concurrent.
*
;
import java.util. * ;
public class TimerTask implements Runnable ... {
/** *//**定时器事件队列*/
PriorityBlockingQueue<TimerSlot> queue_ = new PriorityBlockingQueue<TimerSlot>(2048);
/** *//** Creates a new instance of TimerTask */
public TimerTask() ...{
}
/** *//**设置定时器,并放入队列*/
public synchronized Object setTimer(String taskname, String eventname, int timerevent, int delay, Object param)...{
TimerSlot slot = new TimerSlot();
slot.taskname = taskname;
slot.eventname = eventname;
slot.timerevent = timerevent;
slot.expiretime = System.currentTimeMillis() + delay;
slot.param = param;
try ...{
queue_.put(slot);
} catch (Exception ex) ...{
}
return 0;
}
/** *//**去掉指定的定时器*/
protected synchronized int killTimer(Object timer)...{
if (queue_.remove(timer))...{
return 0;
}
return -1;
}
/** *//**关闭操作*/
public void close()...{
queue_.clear();
}
/** *//**线程运行,检查定时器是否触发*/
public void run()...{
while (true)...{
try...{
TimerSlot slot = queue_.peek();
if (slot == null) ...{
Thread.sleep(50);
continue;
}
long now = System.currentTimeMillis();
if (now < slot.expiretime) ...{
Thread.sleep(Math.min(slot.expiretime-now,50));
continue;
}
queue_.remove();
TaskMsg taskmsg = new TaskMsg();
taskmsg.eventName=slot.eventname;
taskmsg.eventNo = slot.timerevent;
taskmsg.msg = (slot.param);
taskmsg.sender = "__timer";
taskmsg.receiver = slot.taskname;
TaskFactory.getInstance().getTaskByName(slot.taskname).
putmsgtoqueue(taskmsg);
}catch(InterruptedException e)...{
return;
}
}
}
class TimerSlot implements java.lang.Comparable<TimerSlot>...{
public String eventname;
public String taskname;
public int timerevent;
public long expiretime; // ms, System.current+delay
public Object param;
public int compareTo(TimerSlot other) ...{
return (int)(this.expiretime-other.expiretime);
}
}
}
import java.util. * ;
public class TimerTask implements Runnable ... {
/** *//**定时器事件队列*/
PriorityBlockingQueue<TimerSlot> queue_ = new PriorityBlockingQueue<TimerSlot>(2048);
/** *//** Creates a new instance of TimerTask */
public TimerTask() ...{
}
/** *//**设置定时器,并放入队列*/
public synchronized Object setTimer(String taskname, String eventname, int timerevent, int delay, Object param)...{
TimerSlot slot = new TimerSlot();
slot.taskname = taskname;
slot.eventname = eventname;
slot.timerevent = timerevent;
slot.expiretime = System.currentTimeMillis() + delay;
slot.param = param;
try ...{
queue_.put(slot);
} catch (Exception ex) ...{
}
return 0;
}
/** *//**去掉指定的定时器*/
protected synchronized int killTimer(Object timer)...{
if (queue_.remove(timer))...{
return 0;
}
return -1;
}
/** *//**关闭操作*/
public void close()...{
queue_.clear();
}
/** *//**线程运行,检查定时器是否触发*/
public void run()...{
while (true)...{
try...{
TimerSlot slot = queue_.peek();
if (slot == null) ...{
Thread.sleep(50);
continue;
}
long now = System.currentTimeMillis();
if (now < slot.expiretime) ...{
Thread.sleep(Math.min(slot.expiretime-now,50));
continue;
}
queue_.remove();
TaskMsg taskmsg = new TaskMsg();
taskmsg.eventName=slot.eventname;
taskmsg.eventNo = slot.timerevent;
taskmsg.msg = (slot.param);
taskmsg.sender = "__timer";
taskmsg.receiver = slot.taskname;
TaskFactory.getInstance().getTaskByName(slot.taskname).
putmsgtoqueue(taskmsg);
}catch(InterruptedException e)...{
return;
}
}
}
class TimerSlot implements java.lang.Comparable<TimerSlot>...{
public String eventname;
public String taskname;
public int timerevent;
public long expiretime; // ms, System.current+delay
public Object param;
public int compareTo(TimerSlot other) ...{
return (int)(this.expiretime-other.expiretime);
}
}
}