疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java多线程--Timer初识


 

  Timer初识 Timer在英文中的意思是"定时器",那么早在JDK1.3的时候,这个计时器类就出现在了JDK的类库中,所见即所得,显示生活中定时器的作用显而易见,也非常的实用。又比如我们常见的定时炸弹就是一个定时器的典型应用,再一个上班族都感知切的一个就是闹钟了,特别是正点闹钟(我个人用的是正点闹钟这个app,挺好用的,顺便打个小广告),这个闹钟我们设定了一个时间后,只要不发生bug,就会每天那个时间点叫我们起床了,可是这个又爱又恨的闹钟啊,我这里就借用你的苦衷来说说程序世界的Timer了~ ~

  开门见山:(一年级的小K按捺不住了,本拉登情怀大爆发,危险迫在眉睫) K:吼吼,我要搞恐怖,我要搞炸弹…

  public static void main(String[] args) {

  Timer timer = new Timer(); // 创建一个定时器

  timer.schedule(new TimerTask() { // 定时器调度执行一个定时器任务

  @Override

  public void run() {

  System.out.println("bombing…");

  }

  }, 5000);

  time(); // 计时,直观打印执行时间

  }

  K:不要无视我的发明,定时鞭炮有他就没你(由于修炼不够,小K最终搞了个定时鞭炮):

  1.Timer timer = new Timer();要搞一个定时鞭炮,首先得搞一个弹夹吧,这里做了一个定时弹夹,然后贴上商标"我是牛牛定时…"还不能爆炸,不敢往后吹了。

  2.new TimerTask() {…}这里才是定时鞭炮的核心东西,把线路和火药安装好,然后塞到炸弹夹中,这样才有可能发出威力了。

  3.timer.schedule(new TimerTask() {…}, 5000); 遥控器一按,5秒钟后我就要爆炸,吼吼吼~

  Y:小K别逗了,虽然炸了,可是那个time()是个啥玩意吗?! K:嗨,看好了,这个time()是我的一个小弟(方法),他没啥事就给报时的呢,不要再问了哈,烦得很!

  /**

  * 计时,直观打印执行时间

  */

  private static void time() {

  int second = 0;

  int minute = 0;

  int hour = 0;

  while (true) {

  try {

  Thread.sleep(1000);

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  second++;

  if (60 == second) {

  second = 0;

  minute++;

  if (60 == minute) {

  hour++;

  minute = 0;

  }

  }

  System.out.println((hour < 10 ? ("0" + hour) : hour) + "【时】"

  + (minute < 10 ? ("0" + minute) : minute) + "【分】"

  + (second < 10 ? ("0" + second) : second) + "【秒】");

  }

  }

  Y:呦呵,还带小弟呢,让你小弟给我也报报时,不然我哪知道你的定时炸弹的定时效果是不是精确的。嗯…你这个定时鞭炮不给力啊,我见过年那些小家伙玩的炮火都有五连响呢??? K:哈哈,莫急莫急,待我潜心研究研究,搞科学嘛,来不得半点虚假的噢… 一个月后的一天,操场上第八套广播体操进行时,只见小K报了一个大家伙,屁颠屁颠的跑向中心,手做喇叭状,噼里啪啦开始了:

  public static void main(String[] args) {

  Timer timer = new Timer();

  timer.schedule(new TimerTask() {

  @Override

  public void run() {

  System.out.println("bombing…");

  }

  }, 5000, 1000); // 五秒钟爆炸后延迟一秒钟再接着炸,如此反复下去

  time(); // 小弟报时中…

  }

  K:(只见小K一脸得意),偶闭关修炼一个月,也搞了个连环炸弹,那些连环炮算个啥,我这可是无限连环炸,呵,呵呵,呵呵呵… Y:… …小k,你这个很饶民的,你不让停下来我就去告官啦啦啦~

  K:OMG,我发明这个的时候没有想过去停止他耶,给我点时间想想,再说你告官,你兜里没子呢,同学一场嘛… 【正当大家要抓小K去官府的时候,小K屁股一拍,一溜烟就跑的无踪影了,可是响声将大家的愤怒一直进行到底…】 …… …… 【一周后,小K拖着一副疲惫的身躯出现在同学面前,可是这次他手上的那玩意看起来很华丽,远处看上去多了一些东西:】

  public static void main(String[] args) {

  Timer timer = new Timer();

  timer.schedule(new TimerTask() {

  int times = 0; // 可以外部设定

  @Override

  public void run() {

  System.out.println("bombing…");

  times++;

  if (5 == times) {

  cancel(); // 取消任务

  }

  }

  }, 5000, 1000); // 五秒钟爆炸后延迟一秒钟再接着炸,如此反复下去

  time(); // 小弟报时中…

  }

  【只听见炸了五响,就停了,这才稍微消解大家心头的愤怒,于是有人发现商机了…】 Y:小K,你小子可以啊,你这次出山,在上面搞了那么多按钮,看起来华丽了,实际上也更华丽了,那个,那个…能不能给个操作手册啊,让你的发明在我们这发扬。【一帮小弟蜂拥而上,捶背,捏腿,一身疲惫的小K似乎找到了一点点成就感。】 K:一帮臭小子,早就料到你们有这一出,要不然我披星戴月图啥,听好了,先给你们说道说道我的发明【从口袋抽出遥控器,指着上面的按钮手舞足蹈地开始演讲】: schedule(TimerTask task,Date time);指定时间开始爆炸。 schedule(TimerTask task, long delay);指定delay毫秒延迟时间后爆炸一次。【小K之间的发明】

  schedule(TimerTask task,Date firstTime, long period) ;指定firstTime开始爆炸,然后延迟period毫秒后循环爆炸。

  schedule(TimerTask task, long delay, long period);指定延迟delay毫秒后开始爆炸,然后延迟period毫秒后循环爆炸。

  cancel();认为控制爆炸次数和时间,取消定时器的任务。

  【…… 小K还没有讲完,一家伙抢过去手册,快速走观之后提出一疑问:"scheduleAtFixedRate(TimerTask task,Date firstTime, long period)"和"scheduleAtFixedRate(TimerTask task,long delay, long period)"有是社么意思呢?】小K:猴急啥,正要将呢: schedule(TimerTask task, long delay, long period)第一次在指定的delay延迟时间爆炸后,以后每次都要延迟指定的period的时间爆炸,后面每一次爆炸的延迟时间是参照前一次的,就是说前一次的爆炸之间出了故障延迟了,以后的每一次都会向后延迟,这有什么好处呢?就能保持一个"平稳"的间隔。 scheduleAtFixedRate(TimerTask task, long delay, long period)第一次在指定的delay延迟时间爆炸后,以后没此爆炸都会在固定的period爆发,这个参照点是第一次爆炸,如果某次有故障而延迟了,这次后面的所有爆炸不会因为这个延迟,这样就能保证一个绝对的固定时间间隔去爆炸,所以有一个固定的频率,那么这样一来我们有可能在某个时间点听到几个响声或者一个很大的响声,不要以为这是我的发明有问题,手册说明(JDK文档),你能懂的。