JDK 1.8.0_162:
java.util.Timer:533-550
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);
}
}
}
验证代码:
public static void main(String[] args) {
Timer t = new Timer(false);
t.schedule(new TimerTask() {
int a=0;
@Override
public void run() {
try {
System.out.println("任务开始");
System.out.println(new Date());
if(a==0) {
a++;
Thread.sleep(1000 * 5);
}
System.out.println(new Date());
System.out.println("任务结束");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, 0, 1000 * 2);
// t.scheduleAtFixedRate(new TimerTask() {
// int a=0;
// @Override
// public void run() {
// try {
// System.out.println("任务开始");
// System.out.println(new Date());
// if(a==0) {
// a++;
// Thread.sleep(1000 * 5);
// }
// System.out.println(new Date());
// System.out.println("任务结束");
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
// }, 0, 1000 * 2);
System.out.println("start");
}
schedule [ period<0 ]
start
任务开始
Mon Nov 26 00:24:07 CST 2018
Mon Nov 26 00:24:12 CST 2018
任务结束
任务开始
Mon Nov 26 00:24:12 CST 2018
Mon Nov 26 00:24:12 CST 2018
任务结束
任务开始
Mon Nov 26 00:24:14 CST 2018
Mon Nov 26 00:24:14 CST 2018
任务结束
任务开始
Mon Nov 26 00:24:16 CST 2018
Mon Nov 26 00:24:16 CST 2018
任务结束
---------------------------------------------------------------------------
scheduleAtFixedRate [ period>0 ]
start
任务开始
Mon Nov 26 00:22:12 CST 2018
Mon Nov 26 00:22:17 CST 2018
任务结束
任务开始
Mon Nov 26 00:22:17 CST 2018
Mon Nov 26 00:22:17 CST 2018
任务结束
任务开始
Mon Nov 26 00:22:17 CST 2018
Mon Nov 26 00:22:17 CST 2018
任务结束
任务开始
Mon Nov 26 00:22:18 CST 2018
Mon Nov 26 00:22:18 CST 2018
任务结束
任务开始
Mon Nov 26 00:22:20 CST 2018
Mon Nov 26 00:22:20 CST 2018
任务结束
任务开始
Mon Nov 26 00:22:22 CST 2018
Mon Nov 26 00:22:22 CST 2018
任务结束