Java 计时器

摘要:
TimerTask是一个实现Runnable接口的抽象类,表示可以由Timer执行的任务。Intpurge()从此计时器的任务队列中删除所有已取消的任务。Voidschedule计划在指定的时间执行指定的任务。Voidschedule计划指定的任务在指定的时间以固定的延迟开始重复。执行完所有任务后,删除相应计时器对象的引用,线程也将终止(=null){…}最后{logTimer.cancel();}它只是方法的一部分,没有运行结果。

1.Timer and TimerTask:

Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次。

TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任务。

2. Steps :

  (1)继承TimerTask,注意TimerTask是实现Runnable接口的,因此只要重载run() 方法即可。

  (2)创建Timer对象,调用schedule()方法。

3. Methods:

void cancel()

终止此计时器,丢弃所有当前已安排的任务。

int purge()

从此计时器的任务队列中移除所有已取消的任务。

void schedule(TimerTask task, Date time)

安排在指定的时间执行指定的任务。

void schedule(TimerTask task, Date firstTime, long period)

安排指定的任务在指定的时间开始进行重复的固定延迟执行

void schedule(TimerTask task, long delay)

安排在指定延迟后执行指定的任务。

void schedule(TimerTask task, long delay, long period)

安排指定的任务从指定的延迟后开始进行重复的固定延迟执行

void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)

安排指定的任务在指定的时间开始进行重复的固定速率执行

void scheduleAtFixedRate(TimerTask task, long delay, long period)

安排指定的任务在指定的延迟后开始进行重复的固定速率执行

注: 时间都是 毫秒 (ms)

schedule VS. scheduleAtFixedRate

这两个方法都是任务调度方法,他们之间区别是,schedule会保证任务的间隔是按照定义的period参数严格执行的,如果某一次调度时间比较长,那么后面的时间会顺延,保证调度间隔都是period,而scheduleAtFixedRate是严格按照调度时间来的,如果某次调度时间太长了,那么会通过缩短间隔的方式保证下一次调度在预定时间执行。举个栗子:你每个3秒调度一次,那么正常就是0,3,6,9s这样的时间,如果第二次调度花了2s的时间,如果是schedule,就会变成0,3+2,8,11这样的时间,保证间隔,而scheduleAtFixedRate就会变成0,3+2,6,9,压缩间隔,保证调度时间。

4: 如何终止Timer线程

  默认情况下,创建的timer线程会一直执行,主要有下面四种方式来终止timer线程:

  • 调用timer的cancle方法
  • 把timer线程设置成daemon线程,(new Timer(true)创建daemon线程),在jvm里,如果所有用户线程结束,那么守护线程也会被终止,不过这种方法一般不用。
  • 当所有任务执行结束后,删除对应timer对象的引用,线程也会被终止。
  • 调用System.exit方法终止程序。

5. 总结

  • 每一个Timer仅对应唯一一个线程。
  • Timer不保证任务执行的十分精确。
  • Timer类的线程安全的。

Example:

Timer logTimer = new Timer();
        try{
            Set<Property> additionalCompressFields = additionalCompressedLevels.get(timeCompressionLevel);
            Map<String, IPosting> compressedPostings = new HashMap<String, IPosting>();
            final ConcurrentLinkedDeque<Posting> postingsDeque = new ConcurrentLinkedDeque<Posting>();
            postingsDeque.addAll(postings);
            Posting posting = null;
            {
                //Start a timer to print the remaining posting size
                TimerTask task = new TimerTask(){
                    @Override
                    public void run() {
                        if(postingsDeque.size() > 0 ) {
                            LOGGER.log(Level.INFO, ">>>>>> Remainning items to compress [" + postingsDeque.size() + "] <<<<<<<<<");
                        } 
                    }
                    
                };
                logTimer.scheduleAtFixedRate(task, 30000, 30000);
            }
            while((posting = postingsDeque.poll()) != null){
               ...
            }
        }finally{
            logTimer.cancel();
        }

只是个方法一部分,没有运行结果。

免责声明:文章转载自《Java 计时器》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇熟悉Hbase常用命令及操作快速搭建MQTT服务器(MQTTnet和Apache Apollo)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C# 计时器的三种使用方法

在.net中有三种计时器,一是System.Windows.Forms命名空间下的Timer控件,它直接继承自Componet;二是System.Timers命名空间下的Timer类。 Timer控件:Timer控件只有绑定了Tick事件,和设置Enabled=True后才会自动计时,停止计时可以用Stop()控制,通过Stop()停止之后,如果想重新计时...

object-c之计时器

主要代码: 1 先设置一个定时器 2 TimeInterval:设置时间间隔 3 target:表示发送的对象 4 selector:选择一个实例方法 5 userInfo:此参数可以为nil,当定时器失效时,由你指定的对象保留和释放该定时器 6 7 [NSTimer scheduledTimerWithTimeInterval:2.0ftarget:s...

使用FreeRTOS进行性能和运行时分析

在MCU on Eclipse网站上看到Erich Styger在2月25日发的博文,一篇关于使用FreeRTOS进行性能和运行分析的文章,本人觉得很有启发,特将其翻译过来以备参考。当然限于个人水平,有描述不当之处恳请指正。原文网址:https://mcuoneclipse.com/2018/02/25/performance-and-runtime-an...

System.Threading.Timer类的TimerCallback 委托(转载)

System.Threading.Timer 是一个使用回调方法的计时器,而且由线程池线程服务,简单且对资源要求不高。   只要在使用 Timer,就必须保留对它的引用。对于任何托管对象,如果没有对 Timer 的引用,计时器会被垃圾回收。即使 Timer 仍处在活动状态,也会被回收。当不再需要计时器时,请使用 Dispose 方法释放计时器持有的资源。...

C#中精确计时的一点收获

以下所有代码运行环境:Windows 2003, Intel(R) Core(TM) 2 Duo CPU E8400@ 3.00GHz 2.99GHz,2.96GB内存 根据综合网上的一些文章,精确计时主要有以下几种方式 1 调用WIN API中的GetTickCount [DllImport("kernel32")] static extern uin...

c#数字图像处理(二)彩色图像灰度化,灰度图像二值化

为加快处理速度,在图像处理算法中,往往需要把彩色图像转换为灰度图像,在灰度图像上得到验证的算法,很容易移植到彩色图像上。24位彩色图像每个像素用3个字节表示,每个字节对应着R、G、B分量的亮度(红、绿、蓝)。当R、G、B分量值不同时,表现为彩色图像;当R、G、B分量值相同时,表现为灰度图像,该值就是我们所求的一般来说,转换公式有3种。第一种转换公式为: G...