资讯专栏INFORMATION COLUMN

Java定时器之Timer学习二

nemo / 2121人阅读

摘要:代码实例获取当前时间按照指定的格式输出设置成秒之前的时间使用来执行控制台输出方法总结我们可以看到实际的效果是在启动执行的时候,会立马执行次就是为了追赶已经过去的秒。

方法名称 schedule() 和 scheduleAtFixedRate() 的区别

两种情况看区别

首次计划执行的时间早于当前时间

比如说:当前时间是 11:06, 但是首次计划执行的时间应该为: 11:00

任务执行所需的时间超出任务的执行周期间隔

比如说:我们执行的任务的时间为 3秒,但是任务执行的周期间隔为 2秒

详细分析 首次计划的时间早于当前时间 schedule 方法

fixed-delay; 如果第一次执行的时间被 delay 了,随后的执行时间按照上一次实际执行完成的时间点进行计算。

代码实例

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;

public class DifferenceTest {
    
    public static void main(String[] args) {
        
        // 获取当前时间按照指定的格式输出
        final SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Calendar calendar = Calendar.getInstance();
        System.out.println("current time is:"+ sf.format(calendar.getTime()));
        
        // 设置成6秒之前的时间
        calendar.add(Calendar.SECOND, -6);
        System.out.println("current time minus six second is :"+ sf.format(calendar.getTime()));
        System.out.println("Task is being executed!");
        
        // 使用 timer 来执行
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                System.out.println("scheduled exec time is :"+ sf.format(scheduledExecutionTime()));
            }
        }, calendar.getTime(), 2000);
         
    }

}

控制台输出

current time is:2018-07-05 13:09:57
current time minus six second is :2018-07-05 13:09:51
scheduled exec time is :2018-07-05 13:09:57
scheduled exec time is :2018-07-05 13:09:59
scheduled exec time is :2018-07-05 13:10:01
scheduled exec time is :2018-07-05 13:10:03
scheduled exec time is :2018-07-05 13:10:05
scheduled exec time is :2018-07-05 13:10:07
scheduled exec time is :2018-07-05 13:10:09

schedule 方法总结

虽然我们是将事件提前了6秒,但是使用 schedule 还是从当前时间开始执行。然后每隔两秒执行一次。

scheduleAtFixedRate 方法

fixed-rate; 如果第一次执行时间被 delay了,随后的执行时间按照上一次开始的点计算,并且为了赶上进度会多次执行任务,因为 TimerTask中的执行需要考虑同步

代码实例

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;

public class DifferenceTest {
    
    public static void main(String[] args) {
        
        // 获取当前时间按照指定的格式输出
        final SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Calendar calendar = Calendar.getInstance();
        System.out.println("current time is:"+ sf.format(calendar.getTime()));
        
        // 设置成6秒之前的时间
        calendar.add(Calendar.SECOND, -6);
        System.out.println("current time minus six second is :"+ sf.format(calendar.getTime()));
        
        // 使用 timer 来执行
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                System.out.println("scheduled exec time is :"+ sf.format(scheduledExecutionTime()));
            }
        }, calendar.getTime(), 2000);
         
    }

}

控制台输出

current time is:2018-07-06 14:32:34
current time minus six second is :2018-07-06 14:32:28
scheduled exec time is :2018-07-06 14:32:28
scheduled exec time is :2018-07-06 14:32:30
scheduled exec time is :2018-07-06 14:32:32
scheduled exec time is :2018-07-06 14:32:34
scheduled exec time is :2018-07-06 14:32:36
scheduled exec time is :2018-07-06 14:32:38

scheduleAtFixedRate 方法总结

我们可以看到实际的效果是:在启动执行的时候,会立马执行3次,就是为了追赶已经过去的6秒。然后再按照设定的间隔,每两秒钟执行一次。

任务执行所需的时间超出任务的执行周期间隔 schedule 方法

下次执行时间相当于上一次实际执行完成的时间点,因为执行的时间会不断延后。

代码实例

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;

public class DifferenceTest {
    
    public static void main(String[] args) {
        
        // 获取当前时间按照指定的格式输出
        final SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Calendar calendar = Calendar.getInstance();
        System.out.println("current time is:"+ sf.format(calendar.getTime()));
        
        // 使用 timer 来执行
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                
                // 模拟当前执行的过程需要 3秒
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                
                // 打印最近一次执行的时间
                System.out.println("scheduled exec time is :"+ sf.format(scheduledExecutionTime()));
            }
        }, calendar.getTime(), 2000);
         
    }

}

控制台输出

current time is:2018-07-06 14:43:51
scheduled exec time is :2018-07-06 14:43:51
scheduled exec time is :2018-07-06 14:43:54
scheduled exec time is :2018-07-06 14:43:57
scheduled exec time is :2018-07-06 14:44:00
scheduled exec time is :2018-07-06 14:44:03

说明

我们可以空控制台中输出的结果中看到:我们当前的时间为 14:43:51,然后第一次计划执行的时间也为 14:43:51。但是以后每次执行的时间都是相隔 3秒钟,并不是我们上面设置 timerTask 的时间间隔 2秒。所以说使用 schedule 方法,在这种情况下会不断的延后。

scheduleAtFixedRate 方法

下一次执行时间相对于上一次开始的时间点,因此执行时间一般不会延后,因此存在并发性

代码实例

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;

public class DifferenceTest {
    
    public static void main(String[] args) {
        
        // 获取当前时间按照指定的格式输出
        final SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Calendar calendar = Calendar.getInstance();
        System.out.println("current time is:"+ sf.format(calendar.getTime()));
        
        // 使用 timer 来执行
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                
                // 模拟当前执行的过程需要 3秒
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                
                // 打印最近一次执行的时间
                System.out.println("scheduled exec time is :"+ sf.format(scheduledExecutionTime()));
            }
        }, calendar.getTime(), 2000);
         
    }

}

控制台输出

current time is:2018-07-07 10:15:51
scheduled exec time is :2018-07-07 10:15:51
scheduled exec time is :2018-07-07 10:15:53
scheduled exec time is :2018-07-07 10:15:55
scheduled exec time is :2018-07-07 10:15:57
scheduled exec time is :2018-07-07 10:15:59

说明

当执行的频率为2秒钟,但是执行的时间为3秒的时。我们从控制台上的输出可以看到,执行的频率还是为2秒,因此就会存在并发性。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71603.html

相关文章

  • Java时器Timer学习

    摘要:类是一个定时任务类,该类实现了接口,而且是一个抽象类说明类是一个抽象类,由安排为一次执行或重复执行的任务。定时器实例有多种构造方法创建一个新计时器。 Timer 的定义 有且仅有一个后台线程对多个业务进行定时定频的调度。Timer 类可以保证多个线程可以共享单个 Timer 对象而无需进行外部同步,所以 Timer 类是线程安全的。 核心的两个类 java.util.Timer 和 ...

    AaronYuan 评论0 收藏0
  • 慕课网_《Java定时任务调度工具详解Timer篇》学习总结

    时间:2017年05月24日星期三说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:无个人学习源码:https://github.com/zccodere/s... 第一章:课程介绍 1-1 课程介绍 什么是定时任务调度 基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务 在Java中的定时调度工具 Timer:小弟,能实现日常60%的定...

    wind5o 评论0 收藏0
  • JavaScriptweb通信

    摘要:设置一个定时器,定时询问服务器是否有信息,每次建立连接传输数据之后,链接会关闭。通过调用此程序提供的套接口接口与服务器端的套接口进行通信。 本文同步自我的博客园:http://hustskyking.cnblogs.com P.S: 各个平台中就 segmentFault 写博客体验最好了! web通信,一个特别大的topic,涉及面也是很广的。因最近学习了 javascript 中...

    Honwhy 评论0 收藏0
  • (十三)java多线程Timer

    摘要:本人邮箱欢迎转载转载请注明网址代码已经全部托管有需要的同学自行下载引言同步工具都讲的差不多了今天我们换一下口味讲一下定时任务吧理论延时后执行定时任务到达这个时间点执行定时任务延时后执行定时任务之后以为周期重复执行到达这个时间点执行定时任务之 本人邮箱: 欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kcogithub: https://github...

    LuDongWei 评论0 收藏0
  • 两个月的Java实习结束,继续努力

    摘要:花了将近两个星期完成了功能,期间我编写的能力也算是有所提升了。所以能看到这篇文章的同学都是大佬如果想看更多的原创技术文章,欢迎大家关注我的微信公众号。可能感兴趣的链接文章的目录导航微信公众号端文章的目录导航端海量精美脑图 前言 只有光头才能变强 2018年8月30日,今天我辞职了。在6月25号入职,到现在也有两个月时间了。 感受: 第一天是期待的:第一次将项目拉到本地上看的时候,代码...

    snifes 评论0 收藏0

发表评论

0条评论

nemo

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<