在c/s framework中添加一个检测客户端连接是否有效的功能是必要的。我通过在服务器端设置一个临时连接池,在规定时间内,接入临时连接池的客户端做出了服务器端要求它做的动作,我再把它接入正式池,否则直接断开和他的连接。因为目前我的c/s还在初级阶段,依旧采用长连接的方式,添加这个功能避免了恶意连接,可以节省内存资源。
我从这个大的功能里拿出一个小的片段----定时功能,分析后觉得有必要将其写成工具。
下面我来列举我的定时器工具它要做哪些事情:
1. 开启定时器;
2. 关闭定时器;
3. 根据用户制定的时间准确定时,时间到,应完成用户指定的功能。(考虑用抽象类或接口方式实现);
注意:定时应该是多次的,不是一次的,结束应由用户调用关闭定时器方法来结束。
packagecom.zss.util;public abstract class DidaDida implementsRunnable{public static final long DELTATIME = 1000;private volatileObject lock;private volatile booleangoon;private longdeltaTime;publicDidaDida() {this.lock = newObject();
deltaTime=DELTATIME;
}public DidaDida setDeltaTime(longtime) {this.deltaTime =time;return this; //方便链式调用
}public voidstartup() {if (goon == true) { //如果定时器已启动,则无需再次启动
return;
}
goon= true;newDidaWorker();new Thread(this, "计时线程").start();
}public voidclose() {if (goon == false) { //如果定时器已关闭,则无需再次关闭
return;
}
goon= false;
}public abstract voiddoIt();
@Overridepublic voidrun() {while(goon) {try{synchronized(lock) {
lock.wait(deltaTime);//以这种方式实现定时会更加准确
lock.notify(); //这一步唤醒底下的DidaWorker类里的线程
}
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}class DidaWorker implementsRunnable{publicDidaWorker() {new Thread(this).start();
}
@Overridepublic voidrun() {while(goon) {synchronized(lock) {try{
lock.wait();
}catch(InterruptedException e) {
e.printStackTrace();
}
}
doIt();//执行用户操作
}
}
}
}
Test类
public classtest {public static voidmain(String[] args) {newDidaDida() {
@Overridepublic voiddoIt() {
System.out.println(System.currentTimeMillis());
}
}.startup();
}
}
结果:
1554717444528
1554717445529
1554717446529
1554717447529
1554717448529
1554717449529
1554717450529
1554717451530
最后一位是毫秒位。