学堂首页 | 网站开发 | 工具应用 | 站长时代 | 免费资源 | 网络安全 | 服务器类 | 新闻资讯 | 素材欣赏
您的位置: 中国建站大全 -> 网站开发设计 -> JavaScript -> JAVA定时器 源码事例

JAVA定时器 源码事例

作者:佚名  来源:本站整理  发布时间:2008-2-19 7:00:25  发布人:网络

用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);
        }

    }

}

上一篇:数据恢复的方法

下一篇:用PS五步打造CD效果图   

  • · 注册码大全二
  • · 注册码大全四
  • · 注册码大全一
  • · 要10G免费网络硬盘的请进来!...
  • · 通过google 赶快来赚美金
  • · 注册码大全十
  • · 注册码大全三
  • · 头像-qq头像(qq新头像)4
  • · 让你轻松架设FTP服务器1
  • · 梦幻背景图片7
  • · 反流氓软件联盟成立公司...
  • · 利 用 ISAPI 实 现 向 数...
  • · 刚写好的Asp.Net时间和日...
  • · SQL Server如何解决加密...
  • · 高盛摩根导演阿里巴巴香...
  • · CG城的精灵--精灵初现(2...
  • · Flash 动作脚本之:资料速...
  • · 欧洲电子邮箱中垃圾过半...
  • · Layer 图层
  • · 分布式的Qmail邮件系统(...