四. 常用线程解决方案
4.1. 定时器
4.1.1 定时器的实现
定时器的抽象主要用于一些需要定时完成的任务,而在定时期间外部可能会打断计时并要求其重新计时, 这时我们启动一个线程,如果线程时间到了的时间没有重新计时的信号的话就执行定时任务,如果有重新计时的任务的话,则清零后重新计时.
/** * 定时器类 * @author iangao */ public abstract class BlockedTimer implements Runnable{ private long interVal=0; // 定时间隔 private Semaphore reset=new Semaphore(); // 重新计时信号 private boolean stop=false; // 终止信号 public BlockedTimer(long interVal){ this.interVal=interVal; }// http://www.csdn.net/blog/Iangao /** * 定时循环// http://www.csdn.net/blog/Iangao */ public void run() {// http://www.csdn.net/blog/Iangao stop=false;// http://www.csdn.net/blog/Iangao while(!stop){// http://www.csdn.net/blog/Iangao try {// http://www.csdn.net/blog/Iangao // 如果终断,则重新等待 if(!reset.p(interVal)){ onTimer(); // 如果没接到重新计时信号,则执行Timer事件 }// http://www.csdn.net/blog/Iangao } catch (InterruptedException e) { break; } }// http://www.csdn.net/blog/Iangao stop=true; }http://www// http://www.csdn.net/blog/Iangao.csdn.net/blog/Iangao /** * 发送重新计时信号 */ public void reset(){// http://www.csdn.net/blog/Iangao reset.v();// http://www.csdn.net/blog/Iangao }// http://www.csdn.net/blog/Iangao /** * 终止计时器// http://www.csdn.net/blog/Iangao */ public void stop(){ stop=true;// http://www.csdn.net/blog/Iangao reset();// http://www.csdn.net/blog/Iangao } /** * 启动计时器// http://www.csdn.net/blog/Iangao */ public void start(){ new Thread(this).start(); }// http://www.csdn.net/blog/Iangao /** * 事件响应// http://www.csdn.net/blog/Iangao */ public abstract void onTimer(); } |
4.1.2 定时器的测试
下面我们对定时器进行测试:
/** * 定时器测试类 * @author iangao */ public class BlockTimerTest { public static void main(String[] args){ // Timer: 每1秒种执行一次例行任务 BlockedTimer timer=new BlockedTimer(1000){ Clock clock=new Clock(); // 计算两次getDelay()之间的时差的类 // Timer的例行任务 public void onTimer() {// http://www.csdn.net/blog/Iangao System.out.println("timer.doTimer(): 延时:"+clock.getDelay()); }// http://www.csdn.net/blog/Iangao public void reset(){// http://www.csdn.net/blog/Iangao super.reset();// http://www.csdn.net/blog/Iangao System.out.println("timer.reset(): 延时:"+clock.getDelay()); }// http:// http://www.csdn.net/blog/Iangao//www.csdn.net/blog/Iangao }; timer.start();// http://www.csdn.net/blog/Iangao // Reset: 每隔1.8秒发送一次重新计时信号 for(int i=0; i<3; i++){ timer.reset();// http://www.csdn.net/blog/Iangao try {// http://www.csdn.net/blog/Iangao Thread.sleep(1800); } catch (InterruptedException e) {} }// http://www.csdn.net/blog/Iangao timer.stop();// http://www.csdn.net/blog/Iangao }// http://www.csdn.net/blog/Iangao }// http://www.csdn.net/blog/Iangao |
测试结果如下: timer.reset(): 延时:0 timer.doTimer(): 延时:1001 timer.reset(): 延时:801 timer.doTimer(): 延时:1002 timer.reset(): 延时:801 timer.doTimer(): 延时:1001 timer.reset(): 延时:802 |
根据如上测试结果我们可以看出:每次reset后,timer都会重新计时,而如果在延时期间没有被终断的话,则会执行计时任务.