任务调度之Timer与TimerTask配合

Posted yanze

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了任务调度之Timer与TimerTask配合相关的知识,希望对你有一定的参考价值。

什么是任务调度?

在实际业务中,我们经常需要定时、定期、或者多次完成某些任务,对这些任务进行管理,就是任务调度。任务调度与多线程密切相关。

 

任务调度有多种方式

Timer与TimerTask配合

Timer 定时器,能在主线程外另起线程完成任务

TimerTask 实现Runnable接口的抽象类,相当于一个任务

 

来一个简单的例子:

import java.util.Timer;
import java.util.TimerTask;

public class TestTimer {
    
    public static void main(String args[]){
new Reminder(3);
        System.out.println("调度完成。");
    }
    
    public static class Reminder{
        Timer timer;
        
        public Reminder(int sec){
            timer = new Timer();
       //开始调度任务 timer.schedule(
new TimerTask(){ public void run(){ System.out.println("时间到!");
            //重要:终止内部线程! timer.cancel(); } }, sec
*1000); } } }

会输出:

调度完成。

时间到!

 

原理:Timer的构造函数里会起一个单独的线程(new Thread())来执行计划任务,并在任务完成后结束线程。

 

Timer如何终止内部线程?

1、调用timer的cancle方法(最常用,如上例)

2、把timer线程设置成daemon线程,(new Timer(true)创建daemon线程),在jvm里,如果所有用户线程结束,那么守护线程也会被终止,不过这种方法一般不用。

3、当所有任务执行结束后,删除对应timer对象的引用,线程也会被终止。

4、调用System.exit方法终止程序

 

注意点:

1、每一个Timer仅对应唯一一个线程

2、Timer不保证任务执行的十分精确。

3、Timer类的线程安全的

 

以上是关于任务调度之Timer与TimerTask配合的主要内容,如果未能解决你的问题,请参考以下文章

Timer与ScheduledThreadPoolExecutor

Spring任务调度之Timer

Timer/TimerTask

定时任务调度工作(学习记录 一)

Timer类和TimerTask类

Java基础系列6:计时器Timer与新闻的定时自动采集