zoukankan      html  css  js  c++  java
  • Java的Timer定时器

      Timer主要用于Java线程里指定时间或周期运行任务,它是线程安全的,但不提供实时性(real-time)保证。

      

      上面提到了守护线程的概念。

      Java分为两种线程:用户线程和守护线程。

      所谓守护线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因 此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。

      守护线程和用户线程的唯一不同之处就在于虚拟机的离开:如果用户线程已经全部退出运行了,只剩下守护线程存在了,虚拟机也就退出了。 因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了。

      将线程转换为守护线程可以通过调用Thread对象的setDaemon(true)方法来实现。在使用守护线程时需要注意以下几点:

      (1) thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。

      (2) 在Daemon线程中产生的新线程也是Daemon的。

      (3) 守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断。

      

      我们接下来写个案例,使得程序运行3秒后在控制台打印输出“该起床了”。  

    package com.itszt.test7;
    import java.text.SimpleDateFormat;
    import java.util.Timer;
    import java.util.TimerTask;
    /**
     * Java计时器
     */
    public class TimerTest {
        static String str="HH:mm:ss";
        static SimpleDateFormat dateFormat = new SimpleDateFormat(str);
    
        public static void main(String[] args) {
            Timer timer = new Timer();
            String now1 = dateFormat.format(System.currentTimeMillis());
            System.out.println(now1);
            //延迟3秒后执行任务
            timer.schedule(new MyTask(),3000);//单位是毫秒
        }
    }
    class MyTask extends TimerTask{
        @Override
        public void run() {
            System.out.println("该起床了");
            String now2 = TimerTest.dateFormat.format(System.currentTimeMillis());
            System.out.println(now2);
        }
    }
    

       上述代码执行后,延迟3秒打印出“该起床了”,如下所示:

    21:26:18
    该起床了
    21:26:21
    

       Timer的其他方法:

      schedule(TimerTask task, Date time)  在指定的日期执行一次TimerTask任务;如果日期time早于当前时间,则立刻执行。

      schedule(TimerTask task, long delay, long period)  以当前时间为基准,延迟指定的毫秒后,再按指定的时间间隔地无限次数的执行TimerTask任务。

      schedule(TimerTask task, Date firstTime, long period)  在指定的日期之后,按指定的时间间隔地无限次数的执行TimerTask任务。

      scheduleAtFixedRate(TimerTask task, long delay, long period)  以当前时间为基准,延迟指定的毫秒后,再按指定的时间间隔周期性地无限次数的执行TimerTask任务。

  • 相关阅读:
    POJ 2752 Seek the Name, Seek the Fame
    POJ 2406 Power Strings
    KMP 算法总结
    SGU 275 To xor or not to xor
    hihocoder 1196 高斯消元.二
    hihoCoder 1195 高斯消元.一
    UvaLive 5026 Building Roads
    HDU 2196 computer
    Notions of Flow Networks and Flows
    C/C++代码中的笔误
  • 原文地址:https://www.cnblogs.com/lizhangyong/p/8921980.html
Copyright © 2011-2022 走看看