定时器工具----java

   在c/s framework中添加一个检测客户端连接是否有效的功能是必要的。我通过在服务器端设置一个临时连接池,在规定时间内,接入临时连接池的客户端做出了服务器端要求它做的动作,我再把它接入正式池,否则直接断开和他的连接。因为目前我的c/s还在初级阶段,依旧采用长连接的方式,添加这个功能避免了恶意连接,可以节省内存资源。

我从这个大的功能里拿出一个小的片段----定时功能,分析后觉得有必要将其写成工具。

 

下面我来列举我的定时器工具它要做哪些事情:

1. 开启定时器;

2. 关闭定时器;

3. 根据用户制定的时间准确定时,时间到,应完成用户指定的功能。(考虑用抽象类或接口方式实现);

注意:定时应该是多次的,不是一次的,结束应由用户调用关闭定时器方法来结束。

 

package com.zss.util;

public abstract class DidaDida implements Runnable{
    public static final long DELTATIME = 1000;
    private volatile Object lock;
    private volatile boolean goon;
    private long deltaTime;
    
    public DidaDida() {
        this.lock = new Object();
        deltaTime = DELTATIME;
    }

    public DidaDida setDeltaTime(long time) {
        this.deltaTime = time;                    
        return this;                               // 方便链式调用
    }
    
    public void startup() {
        if (goon == true) {                        //如果定时器已启动,则无需再次启动
            return;
        }
        goon = true;
        new DidaWorker();
        new Thread(this, "计时线程").start();
    }
    
    public void close() {
        if (goon == false) {                       //如果定时器已关闭,则无需再次关闭
            return;
        }
        goon = false;
    }

    public abstract void doIt();
    
    @Override
    public void run() {
        while (goon) {
            try {
                synchronized (lock) {
                    lock.wait(deltaTime);        // 以这种方式实现定时会更加准确
                    lock.notify();               // 这一步唤醒底下的DidaWorker类里的线程
                }
                
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    class DidaWorker implements Runnable{
        public DidaWorker() {
            new Thread(this).start();
        }

        @Override
        public void run() {
            while (goon) {
                synchronized (lock) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                doIt();                          //执行用户操作
            }
        }
         
    }
    
    
}

 

Test类

public class test {

    public static void main(String[] args) {
        new DidaDida() {
            
            @Override
            public void doIt() {
                System.out.println(System.currentTimeMillis());
            }
        }.startup();
    }

}

 

结果:

1554717444528
1554717445529
1554717446529
1554717447529
1554717448529
1554717449529
1554717450529
1554717451530

最后一位是毫秒位。

 

posted on 2019-04-08 18:02  上进小青年!  阅读(397)  评论(0编辑  收藏  举报

导航