Java同步技术(九)

四. 常用线程解决方案

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都会重新计时,而如果在延时期间没有被终断的话,则会执行计时任务.
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值