定时器的应用

来源:互联网 发布:标准件网络销售如何做? 编辑:程序博客网 时间:2024/06/13 23:20

一.与定时器相关的两个类

  • Timer类
    • 定时器对象
  • TimerTask类
    • TimerTask就是你要定时所干事情的对应的对象

1.schedule(TimerTask,long)

        new Timer().schedule(new TimerTask() {//schedule中文为安排,调度,为定时器对应调度事件                    @Override                    public void run() {                        System.out.println("bomb!!!");                    }                },3000);//过多少时间再执行run方法;单位是毫秒                  while(true) {                      System.out.println(new Date().getSeconds());                      try {                        Thread.sleep(1000);                    } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                  }

这里写图片描述

2.schedule(TimerTask,long,long)

new Timer().schedule(new TimerTask() {                    @Override                    public void run() {                        System.out.println("bomb!!!");                    }                },5000,3000);//先过5秒执行一次,之后3秒循环执行一次                  while(true) {                      System.out.println(new Date().getSeconds());                      try {                        Thread.sleep(1000);                    } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                  }

这里写图片描述

3.相互循环

有时候可能会碰到一些需求,要你先2秒执行一次,再之后4秒执行一次,再之后2秒执行一次,再之后4秒执行一次,就依次循环执行

  • 显然一个定时器肯定得不得行了
  • 我们可以在定时器内嵌套一个定时器(俗称子母炸弹)
 new Timer().schedule(new TimerTask() {                    @Override                    public void run() {                        System.out.println("bomb!!!");                        new Timer().schedule(new TimerTask() {                            @Override                            public void run() {                                System.out.println("bomb!!!");                            }                        }, 2000);                    }                },4000);

这里写图片描述

  • 但是仅仅只是执行了一次
  • 想到了嵌套,当然方法就是一直嵌套,一直往定时器里面加定时器
  • 那么我们看看如下的代码有没有问题
  new Timer().schedule(new TimerTask() {                    @Override                    public void run() {                        System.out.println("bomb!!!");                        new Timer().schedule(/*new TimerTask() {                            @Override                            public void run() {                                System.out.println("bomb!!!");                            }                        }*/this, 2000);//这里this就是外边定时器的TimerTask对象                    }                },4000);

这样真的可以嘛?

答案是否定的

这里写图片描述

  • 这和炸弹是一个概念,用完了不能再用了,你想用,必须得创建新对象

  • 此时就用要到递归的思想了

 class MyTimerTask extends TimerTask{       //内部类                               @Override                    public void run() {                        System.out.println("bomb!!!");                        new Timer().schedule(/*new TimerTask() {                            @Override                            public void run() {                                System.out.println("bomb!!!");                            }                        }*/new MyTimerTask(), 2000);//递归的思想                    }                 }                 new Timer().schedule(new MyTimerTask(),4000);

这里写图片描述

  • 不过此时效果还没有实现
  • 距离成功只差一步之遥了
  • 我们可以定义一个静态变量(想想为什么是静态!!!)
  • 静态变量初始为0,访问一次内部类就++,用其来控制循环
               private static int count = 0;             public static void main(String[] args) {                 class MyTimerTask extends TimerTask{                                       @Override                    public void run() {                         count=(count+1)%2;                        System.out.println("bomb!!!");                        new Timer().schedule(/*new TimerTask() {                            @Override                            public void run() {                                System.out.println("bomb!!!");                            }                        }*/new MyTimerTask(), 4000-2000*count);                    }                 }                 new Timer().schedule(new MyTimerTask(),4000);                  while(true) {                      System.out.println(new Date().getSeconds());                      try {                        Thread.sleep(1000);                    } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                  }            }

这里写图片描述

4.schedule(TimerTask,Date,long)

  • Date是指定时间执行
  • long是Date对应时间执行后,每过long时间循环执行

还有更多需求,如果是什么工作日周一到周五某时间执行,周末不执行,这种时候可以用开源的QUARTZ来解决