此博客是本人从学生时代开始做笔记所用, 部分是工作所遇问题,做填坑笔记,部分闲来查阅资料,加上自己的理解所总结的学习笔记, 常忙得不可开交,若漏了资料来源,望通知~ 前路漫漫,写点东西告诉自己正在一点点进步,而不要迷失于繁忙。

任务调度之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类的线程安全的

 

posted @ 2019-04-11 14:03  炎泽  阅读(1819)  评论(0编辑  收藏  举报