as6797779
码龄12年的新手
采纳率0%
2021-05-04 20:04

关于Timer双触发的疑问

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定时器的动作

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • software7503 CSDN技术专家团-赖老师(软件之家) 4天前

    你的疑问是

    2021-05-04 20:23:03Timer完成了一次
    2021-05-04 20:23:03Timer完成了一次

    这个同时出现2次吗?

    这种可能性是成在的,可能前面有一次进去了,但是被a锁住了,简单一点讲就是有几个在排序,只要下面的锁已释放,就会出现这种情况。

    点赞 评论 复制链接分享
  • QA_Assistant 有问必答小助手 昨天

    非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

    速戳参与调研>>>https://t.csdnimg.cn/Kf0y

    点赞 评论 复制链接分享

相关推荐