简易定时器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LONG729564606/article/details/80091930

介绍下用到的方法

java.util.Timer类

线程调度任务以供将来在后台线程中执行的功能。 任务可以安排一次执行,或定期重复执行。
对应于每个Timer对象是单个后台线程,用于依次执行所有定时器的所有任务。 计时器任务应该快速完成。 如果一个定时器任务需要花费很多时间来完成,它会“计时”计时器的任务执行线程。 这可能会延迟随后的任务的执行,这些任务在(和)如果违规任务最后完成时,可能会“束起来”并快速执行。

在最后一次对Timer对象的引用后,所有未完成的任务已完成执行,定时器的任务执行线程正常终止(并被收集到垃圾回收)。 但是,这可能需要任意长时间的发生。 默认情况下,任务执行线程不作为守护程序线程运行,因此它能够使应用程序终止。 如果主叫方想要快速终止定时器的任务执行线程,则调用者应该调用定时器的cancel方法。

如果定时器的任务执行线程意外终止,例如,因为它调用了stop方法,那么在计时器上安排任务的任何进一步的尝试将会产生一个IllegalStateException ,就像定时器的cancel方法被调用一样。

这个类是线程安全的:多个线程可以共享一个单独的Timer对象,而不需要外部同步。

此类不提供实时保证:使用Object.wait(long)方法是调度任务。

Java 5.0引入了java.util.concurrent软件包,其中一个java.util.concurrent程序是ScheduledThreadPoolExecutor ,它是用于以给定速率或延迟重复执行任务的线程池。 这实际上是对一个更灵活的替代Timer / TimerTask组合,因为它允许多个服务线程,接受各种时间单位,并且不需要子类TimerTask (只实现Runnable )。 使用一个线程配置ScheduledThreadPoolExecutor使其等同于Timer 。

实现注意事项:这个类可以扩展到大量并发计划任务(千应该没有问题)。 在内部,它使用二进制堆表示其任务队列,因此计划任务的成本为O(log n),其中n为并发计划任务的数量。

实现注意事项:所有构造函数启动计时器线程。

构造方法

Timer()
创建一个新的计时器。
Timer(boolean isDaemon)
创建一个新的定时器,其相关线程可以指定为 run as a daemon 。
Timer(String name)
创建一个新的定时器,其相关线程具有指定的名称。
Timer(String name, boolean isDaemon)
创建一个新的定时器,其相关线程具有指定的名称,可以指定为 run as a daemon 。

具体实现类详见jdkAPI文档Timer类

java.util.TimerTask类

可以由计时器进行一次性或重复执行的任务。

构造方法

protected TimerTask()
创建一个新的计时器任务。

具体实现类详见jdkAPI文档Timer类

java.util.Calendar类

介绍有点多,就不贴了……

具体实现类详见jdkAPI文档Timer类

下面上代码(我这段代码是在指定时间和间隔执行时间,如需要指定日期或年月,查看Calendar具体方法)

定时器封装类

import java.util.*;

/**
 * 定时器
 * 
 * @author Administrator
 *
 */
public abstract class TimerServer extends TimerTask {
    /**
     * 定时器执行任务
     * 
     * @param hours
     *            定时时间小时
     * @param minutes
     *            定时时间分
     * @param seconds
     *            定时时间秒
     * @param interval
     *            定时时间间隔
     * @param TimerTask对象
     */
    public static void event(Integer hours, Integer minutes, Integer seconds, Integer interval, TimerTask timerTask) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, hours);// 控制小时
        calendar.set(Calendar.MINUTE, minutes);// 控制分钟
        calendar.set(Calendar.SECOND, seconds);// 控制秒
        Date time = calendar.getTime();// 执行任务时间为12:00:00
        Timer timer1 = new Timer();
        timer1.schedule(timerTask, time, interval);
    }
}

定时器实现类

public class TestTimer extends TimerServer {
static Integer i = 1;

public static void main(String[] args) throws Exception {
    TimerServer timerServer = new TimerServer() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            System.out.println("1111111111111111111");
        }
    };
    timerServer.event(11, 38, 50, 60, new TestTimer());
}

@Override
public void run() {
    i++;
    // TODO Auto-generated method stub
    System.out.println("第 " + i + " 次");
}

}

猜你喜欢

转载自blog.csdn.net/LONG729564606/article/details/80091930