下面是 java.util.Timer.TimerThread 的循环内容,里面有个循环看不懂:在 synchronized(queue) 里面,queue 对象已经被锁住了吧?如果这时候还 queue.wait(),谁来唤醒它?不会陷入无限阻塞吗?private void mainLoop() {
while (true) {
try {
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();
} catch(InterruptedException e) {
}
}
}
while (true) {
try {
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();
} catch(InterruptedException e) {
}
}
}
解决方案 »
- 只用AWT制作计算器,不许使用swing?
- java中的反射和类加载器原理是?啥呀?
- 路径问题
- 编写一个图形界面的Application程序,包含一个带图标的
- Hibernate 自动生成主键问题.走过路过的帮忙看看,谢谢!!
- JAVA2 1.5和1.4有什么不一样呢?~
- sql正确执行,可数据库数据没有变化(解决立马给分)
- ★一个非常非常非常简单的送分问题 ★ 一个在Applet 中两个label中,输入输出字符串的入门小例子,为什么只能显示一个label呢?我的代码
- 初学者!请教大家,帮我解决一个jdk不能正常使用的问题
- 哪里有visualcafe的企业版可以下?
- 内容分页的问题
- 求助!java将字符串加密为oracle数据库raw类型!
queue.wait()会释放所持有的对象的lock,其它线程可能唤醒queue,在timer类中,sched(TimerTask task, long time, long period)会唤醒它