java bugdatabase_Fix JDK Timer bug(http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4290274)

/*** The main timer loop.  (See class comment.)*/privatevoidmainLoop() {while(true) {try{//to be scheduled taskTimerTask task;//fired one task?booleantaskFired;synchronized(queue) {//Wait for queue to become non-emptywhile(queue.isEmpty()&&newTasksMayBeScheduled)

queue.wait();if(queue.isEmpty())break;//Queue is empty and will forever remain; die//Queue nonempty; look at first evt and do the right thinglongcurrentTime, executionTime;

task=queue.getMin();synchronized(task.lock) {if(task.state==TimerTask.CANCELLED) {//find the first task from the queue.queue.removeMin();continue;//No action required, poll queue again}//here ,use system current time to determin whether or not fire a taskcurrentTime=System.currentTimeMillis();

executionTime=task.nextExecutionTime;//So when we change system time to long ago,this expression will be evaluate to falseif(taskFired=(executionTime<=currentTime)) {if(task.period==0) {//Non-repeating, removequeue.removeMin();

task.state=TimerTask.EXECUTED;

}else{//Repeating task, reschedulequeue.rescheduleMin(

task.period<0?currentTime-task.period

: executionTime+task.period);

}

}

}if(!taskFired)//Task hasn't yet fired; waitqueue.wait(executionTime-currentTime);

}if(taskFired)//Task fired; run it, holding no lockstask.run();

}catch(InterruptedException e) {

}

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值