public class TimerTest {
public static void main(String[] args) throws ParseException, InterruptedException {
// Timer t = new Timer();
Timer t = new Timer(true);//守护线程方式,当前线程结束自动结束
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse("2021-05-04 19:45:50");
t.schedule(new TimerTask() {
@Override
public void run() {
synchronized ("a") {
System.out.println(sdf.format(new Date())+"Timer完成了一次");
}
}
}, date, 1000*2);
for (int i = 0; i < 10; i++) {
// Thread.sleep(1000);
//
synchronized ("a") {
Thread.sleep(1000);
System.out.println(sdf.format(new Date())+"main循环走了" + i + "次");
}
}
Thread.sleep(1000*5);
}
}
执行结果如下
2021-05-04 19:57:40main循环走了0次
2021-05-04 19:57:41main循环走了1次
2021-05-04 19:57:42main循环走了2次
2021-05-04 19:57:43main循环走了3次
2021-05-04 19:57:44main循环走了4次
2021-05-04 19:57:45main循环走了5次
2021-05-04 19:57:46main循环走了6次
2021-05-04 19:57:47main循环走了7次
2021-05-04 19:57:48main循环走了8次
2021-05-04 19:57:49main循环走了9次
2021-05-04 19:57:49Timer完成了一次
2021-05-04 19:57:49Timer完成了一次
2021-05-04 19:57:51Timer完成了一次
2021-05-04 19:57:53Timer完成了一次
Process finished with exit code 0
为何在19:57:49的地方会执行两次Timer定时器的动作
你的疑问是
2021-05-04 20:23:03Timer完成了一次
2021-05-04 20:23:03Timer完成了一次
这个同时出现2次吗?
这种可能性是成在的,可能前面有一次进去了,但是被a锁住了,简单一点讲就是有几个在排序,只要下面的锁已释放,就会出现这种情况。
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y