资讯专栏INFORMATION COLUMN

(十三)java多线程之Timer

LuDongWei / 1982人阅读

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

本人邮箱:
欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco
github: https://github.com/kco1989/kco
代码已经全部托管github有需要的同学自行下载

引言

同步工具都讲的差不多了,今天我们换一下口味.讲一下定时任务Timer吧.

理论

schedule(TimerTask task, long delay) 延时delayms后执行定时任务task

schedule(TimerTask task, Date time) 到达这个time时间点执行定时任务task

schedule(TimerTask task, long delay, long period) 延时delayms后执行定时任务task,之后以periodms为周期重复执行task

schedule(TimerTask task, Date firstTime, long period) 到达这个time时间点执行定时任务task,之后以periodms为周期重复执行task

scheduleAtFixedRate(TimerTask task, long delay, long period) 延时delayms后执行定时任务task,之后以periodms为周期重复执行task

scheduleAtFixedRate(TimerTask task, Date firstTime, long period) 到达这个time时间点执行定时任务task,之后以periodms为周期重复执行task

细心的人会发现带参数periodschedulescheduleAtFixedRate的解释是一样,但是他们有什么区别
如果周期是30s,任务执行时间是8s,那么两者的执行效果是一样的
但是如果任务执行时间大于周期时间呢?
scheduleAtFixedRate会按照周期时间来,即不管任务执行多久,他都是周期一到就重新执行task,
schedule的下一次开始执行时间是取决与上一次结束时间,如果任务执行时间大于周期时间呢,那么它会按照执行时间为周期执行任务task

例子1 延时炸弹-倒计时炸弹
public class Demo1 {
    public static void main(String[] args) {
        Timer timer = new Timer();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("炸弹爆炸时间:" + dateFormat.format(new Date()));
            }
        }, 4000);
        System.out.println("炸弹安装时间:" + dateFormat.format(new Date()));
    }
}

运行结果:

炸弹安装时间:2016-10-31 20:00:25
炸弹爆炸时间:2016-10-31 20:00:29
例子2 延时炸弹-时间点炸弹(到某个时间点就爆炸的炸弹)
public class Demo2 {
    public static void main(String[] args) throws ParseException {
        Timer timer = new Timer();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("炸弹爆炸时间:" + dateFormat.format(new Date()));
            }
        }, dateFormat.parse("2016-10-31 20:04:00"));
        System.out.println("炸弹安装时间:" + dateFormat.format(new Date()));
    }
}

运行结果

炸弹安装时间:2016-10-31 20:03:11
炸弹爆炸时间:2016-10-31 20:04:00
例子3 延时连环炸弹
public class Demo3 {
    public static void main(String[] args) {
        Timer timer = new Timer();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("炸弹爆炸时间:" + dateFormat.format(new Date()));
            }
        }, 2000,3000);
        System.out.println("炸弹安装时间:" + dateFormat.format(new Date()));
    }
}

运行结果

炸弹安装时间:2016-10-31 20:05:46
炸弹爆炸时间:2016-10-31 20:05:48
炸弹爆炸时间:2016-10-31 20:05:51
炸弹爆炸时间:2016-10-31 20:05:54
炸弹爆炸时间:2016-10-31 20:05:57
炸弹爆炸时间:2016-10-31 20:06:00
炸弹爆炸时间:2016-10-31 20:06:03
炸弹爆炸时间:2016-10-31 20:06:06
......
例子4 时间点连环炸弹
public class Demo4 {
    public static void main(String[] args) throws ParseException {
        Timer timer = new Timer();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("炸弹爆炸时间:" + dateFormat.format(new Date()));
            }
        }, dateFormat.parse("2016-10-31 20:08:30"), 2000);
        System.out.println("炸弹安装时间:" + dateFormat.format(new Date()));
    }
}

运行结果

炸弹安装时间:2016-10-31 20:08:19
炸弹爆炸时间:2016-10-31 20:08:30
炸弹爆炸时间:2016-10-31 20:08:32
炸弹爆炸时间:2016-10-31 20:08:34
炸弹爆炸时间:2016-10-31 20:08:36
炸弹爆炸时间:2016-10-31 20:08:38
炸弹爆炸时间:2016-10-31 20:08:40
炸弹爆炸时间:2016-10-31 20:08:42
炸弹爆炸时间:2016-10-31 20:08:44
炸弹爆炸时间:2016-10-31 20:08:46
炸弹爆炸时间:2016-10-31 20:08:48
......
例子5 带参数periodschedulescheduleAtFixedRate的区别
public class Demo5 {
    public static void main(String[] args) throws ParseException {
        Timer timer = new Timer();
        SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                try {
                    Thread.sleep(4000);
                    System.out.println("sub1执行时间:" + dataFormat.format(this.scheduledExecutionTime()) + " --> 当前时间:" + dataFormat.format(new Date()));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, 0, 2000);
    }
}

运行结果:

sub1执行时间:2016-10-31 08:12:05 --> 当前时间:2016-10-31 08:12:09
sub1执行时间:2016-10-31 08:12:09 --> 当前时间:2016-10-31 08:12:13
sub1执行时间:2016-10-31 08:12:13 --> 当前时间:2016-10-31 08:12:17
sub1执行时间:2016-10-31 08:12:17 --> 当前时间:2016-10-31 08:12:21
sub1执行时间:2016-10-31 08:12:21 --> 当前时间:2016-10-31 08:12:25
sub1执行时间:2016-10-31 08:12:25 --> 当前时间:2016-10-31 08:12:29
sub1执行时间:2016-10-31 08:12:29 --> 当前时间:2016-10-31 08:12:33
sub1执行时间:2016-10-31 08:12:33 --> 当前时间:2016-10-31 08:12:37
sub1执行时间:2016-10-31 08:12:37 --> 当前时间:2016-10-31 08:12:41
.....

现在将schedule改为scheduleAtFixedRate

public class Demo6 {
    public static void main(String[] args) throws ParseException {
        Timer timer = new Timer();
        SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                try {
                    Thread.sleep(4000);
                    System.out.println("sub1执行时间:" + dataFormat.format(this.scheduledExecutionTime()) + " --> 当前时间:" + dataFormat.format(new Date()));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, 0, 2000);
    }
}

运行结果:

sub1执行时间:2016-10-31 08:13:51 --> 当前时间:2016-10-31 08:13:55
sub1执行时间:2016-10-31 08:13:53 --> 当前时间:2016-10-31 08:13:59
sub1执行时间:2016-10-31 08:13:55 --> 当前时间:2016-10-31 08:14:03
sub1执行时间:2016-10-31 08:13:57 --> 当前时间:2016-10-31 08:14:07
sub1执行时间:2016-10-31 08:13:59 --> 当前时间:2016-10-31 08:14:11
sub1执行时间:2016-10-31 08:14:01 --> 当前时间:2016-10-31 08:14:15
sub1执行时间:2016-10-31 08:14:03 --> 当前时间:2016-10-31 08:14:19
.....

两个结果一对比,区别就很明显了

打赏

如果觉得我的文章写的还过得去的话,有钱就捧个钱场,没钱给我捧个人场(帮我点赞或推荐一下)

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

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

相关文章

  • Java线程进阶(十三)—— J.U.Catomic框架:AtomicInteger

    摘要:顾名思义,是类型的线程安全原子类,可以在应用程序中以原子的方式更新值。创建对象先来看下对象的创建。也就是说当一个线程修改一个共享变量时,其它线程能立即读到这个修改的值。 showImg(https://segmentfault.com/img/remote/1460000016012210); 本文首发于一世流云的专栏:https://segmentfault.com/blog... ...

    darkbug 评论0 收藏0
  • 什么是Java线程

    摘要:是不能直接调用系统功能的,所以,我们没有办法直接实现多线程程序。通过查看,我们知道了有种方式实现多线程程序。使用的是抢占式调度模型演示如何设置和获取线程优先级返回线程对象的优先级更改线程的优先级线程默认优先级是。线程优先级的范围是。 第五阶段 多线程 前言: 一个场景:周末,带着并不存在的女票去看电影,无论是现场买票也好,又或是手机买票也好,上一秒还有位置,迟钝了一下以后,就显示该座位...

    高璐 评论0 收藏0
  • Java线程基础(十三)——Thread-Specific Storage(ThreadLocal

    摘要:案例中的类就是线程独有对象的代理者参与者参与者会处理多个委托的工作。然而,的实现思路让每个对象,自身持有一个,这个的就是当前对象,是本地线程变量值。 一、定义 Thread-Specific Storage就是线程独有的存储库,该模式会对每个线程提供独有的内存空间。java.lang.ThreadLocal类提供了该模式的实现,ThreadLocal的实例是一种集合(collecti...

    warnerwu 评论0 收藏0
  • Java线程Java线程基础

    摘要:另外一种方法是,将这个线程加入一个线程组,在线程组里重写方法来处理抛出的异常,这时线程组的作用相当于实现了的类。使用对象处理异常格式错误使用线程组处理异常测试异常 感性地理解一下什么是线程? 线程这个概念其实是比较抽象的,虽然依照教科书上的说法: 进程是从系统获取资源的最小单位,线程是程序执行的最小单位。程序是静态存在于磁盘上的一段文本,进程运行这段文本记录的命令。 也就是说,进程从系...

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

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

    wind5o 评论0 收藏0

发表评论

0条评论

LuDongWei

|高级讲师

TA的文章

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