定时器工具----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
最后一位是毫秒位。