[英]java.util.TimerTask cancel() method exact semantics
我将TimerDoc cancel()方法的语义与JavaDoc与实际行为和源代码进行比较时有点困惑。
JavaDoc谈到了返回值:
如果计划将任务安排一次执行并且已经运行,或者从未计划任务,或者如果任务已经取消,则返回false。
但是,如果任务尚未运行但可以运行,则查找代码可能会返回false 。 我在看java.util.Timer代码( mainLoop()方法):
TimerTask task;
boolean taskFired;
synchronized(queue) {
// Wait for queue to become non-empty
while (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 thing
long currentTime, executionTime;
task = queue.getMin();
synchronized(task.lock) {
if (task.state == TimerTask.CANCELLED) {
queue.removeMin();
continue; // No action required, poll queue again
}
currentTime = System.currentTimeMillis();
executionTime = task.nextExecutionTime;
if (taskFired = (executionTime<=currentTime)) {
if (task.period == 0) { // Non-repeating, remove
queue.removeMin();
task.state = TimerTask.EXECUTED;
} else { // Repeating task, reschedule
queue.rescheduleMin(
task.period<0 ? currentTime - task.period
: executionTime + task.period);
}
}
}
if (!taskFired) // Task hasn't yet fired; wait
queue.wait(executionTime - currentTime);
}
if (taskFired) // Task fired; run it, holding no locks
task.run();
这似乎取消()可以很容易地前的最后一次正确的称为如果因为TimerTask的取消()代码只是设置了任务状态显然不能与任务的同步运行():
public boolean cancel() {
synchronized(lock) {
boolean result = (state == SCHEDULED);
state = CANCELLED;
return result;
}
}
因此,从我的角度来看,上述之后给出的JavaDoc中的“松散”定义确实很严格:
宽松地说,如果此方法阻止一个或多个计划的执行发生,则返回true。
因此,再次看来,由于cancel()方法结果可能会错误 ,这可能意味着该任务没有执行,而是会执行。
请确认我的想法或告诉我我错了。
谢谢!
基本上,我同意你的看法,尽管这是极端的情况。
因此,再次看来,由于cancel()方法结果可能会错误,这可能意味着该任务没有执行,而是会执行。
更精确的是“任务不执行,但将立即执行”。 但是由于线程的并发,简化是有用的,它表示正在(至少)正在执行任务。 因此,javadoc的第二个“定义”对我来说似乎更精确:)
如果cancel()返回true,则表示取消成功,因为至少阻止了进一步执行(对于一次任务或重复任务),而在其他所有情况下为false。
您的理解是正确的, false
结果显然并不表示任务执行已完成 ,而是已经开始 。
理解短语“任务已运行”的最古怪的方式是“事情已经到了cancel
呼叫阻止任务无法运行的地步”。 并且,当您考虑它时,这就是cancel()
的调用者所感兴趣的信息。
因此,是的,我也同意“宽松”条款比“严格”条款更为严格。
请记住,此Javadoc是在Java平台开发的早期就编写的,并且其质量标准一直在不断提高。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.