博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Timer和TimerTask的使用
阅读量:6227 次
发布时间:2019-06-21

本文共 3813 字,大约阅读时间需要 12 分钟。

hot3.png

Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。

TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。

1、添加一个任务,继承实现TimerTask

1
2
3
4
5
6
7
publicclassTemplateTaskextendsTimerTask{
    @Override
    publicvoidrun() {
        // TODO Auto-generated method stub
        System.out.println("正在执行我的任务");
    }
}

2、编写任务调度策略的范围接口

1
2
3
4
5
6
7
publicinterfaceSchedulerService {
    voidschedule(TimerTask task,longdelay);
    voidschedule(TimerTask task,longdelay,longperiod);
    voidschedule(TimerTask task, Date firstTime,longperiod);
    voidscheduleAtFixedRate(TimerTask task,longdelay,longperiod);
    voidscheduleAtFixedRate(TimerTask task, Date firstTime,longperiod);
}

3、实现任务策略接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
publicclassSchedulerServiceImplimplementsSchedulerService {
    //延迟多长时间调用一次就陷入线程等待
    @Override
    publicvoidschedule(TimerTask task,longdelay) {
        newTimer().schedule(task, delay);
    }
   //延迟delay微秒调用一次,以后每隔period微秒执行一次
    @Override
    publicvoidschedule(TimerTask task,longdelay,longperiod) {
        newTimer().schedule(task, delay, period);
    }
   //从firstTime开始执行,每隔period微秒执行一次
    @Override
    publicvoidschedule(TimerTask task, Date firstTime,longperiod) {
        newTimer().scheduleAtFixedRate(task, firstTime, period);
    }
   //延迟delay微秒调用一次,以后每隔period微秒执行一次:方法重在执行频率
    @Override
    publicvoidscheduleAtFixedRate(TimerTask task,longdelay,longperiod) {
        newTimer().scheduleAtFixedRate(task, delay, period);
    }
   //从firstTime开始执行,每隔period微秒执行一次:方法重在执行频率
    @Override
    publicvoidscheduleAtFixedRate(TimerTask task, Date firstTime,longperiod) {
        newTimer().scheduleAtFixedRate(task, firstTime, period);
    }
}

注:建议使用schedule方法。

4、调度业务调用

1
2
3
4
5
6
7
8
9
10
11
publicstaticvoidmain(String[] args) {
        SchedulerService service=newSchedulerServiceImpl();
        // execute one time then the thread turn to wait status
        service.schedule(newTemplateTask(),5*1000);
        // start from now every 5 seconds execute my task
//        service.schedule(new TemplateTask(), new Date(), 5*1000);
        //delay 5 seconds then as 5 seconds time-step to execute my task
//        service.schedule(new TemplateTask(), 5*1000, 5*1000);
//        service.scheduleAtFixedRate(new TemplateTask(), new Date(), 5*1000);
//        service.scheduleAtFixedRate(new TemplateTask(), 5*1000, 5*1000);
}

5、一个完整的小示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
packagecom.boonya.quartz;
importjava.util.Date;
importorg.quartz.Job;
importorg.quartz.JobDetail;
importorg.quartz.JobExecutionContext;
importorg.quartz.JobExecutionException;
importorg.quartz.Scheduler;
importorg.quartz.SchedulerException;
importorg.quartz.SchedulerFactory;
importorg.quartz.SimpleTrigger;
importorg.quartz.Trigger;
importorg.quartz.impl.StdSchedulerFactory;
 
/**
 * Description:最简单的一个定时任务[如果使用web程序框架可以实现任务的动态调用:如spring(Spring MVC)的依赖注入功能]
 * @author boonya
 * @version 1.0
 */
publicclassHelloWorldimplementsJob {
 
    @Override
    publicvoidexecute(JobExecutionContext context)
            throwsJobExecutionException {
        System.out.println("Hello World : "+newDate());
    }
 
    publicstaticvoidmain(String[] args)throwsSchedulerException {
        // 从工厂中返回一个scheduler实例
        SchedulerFactory schedulerFactory =newSchedulerFactoryImpl();
        Scheduler scheduler = schedulerFactory.getScheduler();
        //实例化一个具体任务
        JobDetail jobDetail =newJobDetail("helloWorldJobDetail",
                "helloWorldGroup", HelloWorld.class);
        //为这个任务添加触发器
        Trigger trigger =newSimpleTrigger("helloWorldTrigger",
                "helloWorldGroup",newDate(System.currentTimeMillis() +3000),
                null,5,1*1000);/* 第一个是Trigger的名称,第二个是Trigger的组名,第三个是任务开始时间,第四个是结束时间,第五个是重复次数
                                     * (使用SimpleTrigger.REPEAT_INDEFINITELY常量可表示无限次),最后一个是重复周期(单位是毫秒)。
                                     * 这里意义:开始3秒后执行一次 ,之后每1秒执行一次,执行5次。*/
        //将具体任务和触发器部署到调度器scheduler上,可部署多个job及触发器
        scheduler.scheduleJob(jobDetail, trigger);
        // 启动调度器,开始执行时间计划
        scheduler.start();
    }
 
}
6、注意事项

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

转载于:https://my.oschina.net/weiweiblog/blog/403169

你可能感兴趣的文章
实例演示如何使用AgileEAS.NET SOA平台工作流进行业务流程自定义
查看>>
Spring Cloud Alibaba迁移指南(二):零代码替换 Eureka
查看>>
聊聊BOM的那些事
查看>>
Apache Pulsar中的地域复制,第1篇:概念和功能
查看>>
getRealPath()和getContextPath()的区别
查看>>
Hadoop MapReduce编程 API入门系列之wordcount版本2(六)
查看>>
一个页面标题和过滤输出的解决方案(上)
查看>>
解决windows使用rsync同步到Linux权限问题
查看>>
python pip install 出现 OSError: [Errno 1] Operation not permitted
查看>>
【九度OJ1367】|【剑指offer24】二叉搜索树的后序遍历序列
查看>>
android4.4以上透明状态栏简单设置
查看>>
双十一流量洪峰 支撑阿里核心业务的云数据库揭秘
查看>>
oracle12C 重做日志
查看>>
数据结构与算法4
查看>>
Metasploit 之 modules 与plugins 区别
查看>>
mysql的常用函数
查看>>
完善的复数类(二十五)
查看>>
java书籍列表
查看>>
python初学-列表和字典的几个小例子
查看>>
我的友情链接
查看>>