java中的Timer用法(三) 似乎可以使用了,可以上线了

我们在使用Timer处理定时任务过程中,Timer的操作函数经常会被频繁调用,这个时候就得考虑多线程的问题了,下面的代码启动两个线程频繁操作Timer,

private Timer mTimer;
private void testTimer(){
    startTimer();
    try{
        Log.d(TAG, "sleep");
        Thread.sleep(5000);
    }catch (Exception e){

    }
    stopTimer();

    timethread1.start();
    timethread2.start();
}
Thread timethread1 = new Thread(new Runnable() {
    @Override
    public void run() {
        for(int i=0; i<100; i++){
            Log.d(TAG, "timethread1 startTimer");
            startTimer();
        }
    }
});

Thread timethread2 = new Thread(new Runnable() {
    @Override
    public void run() {
        for(int i=0; i<100; i++){
            Log.d(TAG, "timethread2 startTimer");
            startTimer();
        }
    }
});
 
结果程序空指针了,下面我们再优化一下Timer的操作函数,加上方法锁;
private  synchronized void startTimer(){
    Log.d(TAG, "startTimer");
    if(mTimer != null){
        mTimer.cancel();
        mTimer.purge();
        mTimer = null;
    }

    mTimer = new Timer();
    mTimer.schedule(new TimerTask() {
        @Override
        public void run() {
            Log.d(TAG, "schedule time");
        }
    }, 100, 1000);
}

private synchronized void stopTimer(){
    Log.d(TAG, "stopTimer");
    if(mTimer != null){
        mTimer.cancel();
        mTimer = null;
    }
}

Timer的使用就讲到这里,如有更多使用上的理解,请补充;
 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值