Java定时任务Schedule实现的4种⽅式java实现定时任务 Schedule
2017年09⽉22⽇ 10:30:52  阅读数:3306
标签:
2016-06-07 11:56 16864⼈阅读 (0)
分类:
java(107)
⽬录
1.java定时任务可以借助 java.util.Timer 来实现
[java]
1. import java.util.Calendar;
2. import java.util.Date;
3. import java.util.Timer;
4. import java.util.TimerTask;
5.
6. public class Test {
7.    public static void main(String[] args) {
8.        //timer1();
9.        timer2();
10.        //timer3();
11.        //timer4();
12.    }
13.
14.    // 第⼀种⽅法:设定指定任务task在指定时间time执⾏ schedule(TimerTask task, Date time)
15.    public static void timer1() {
16.        Timer timer = new Timer();
17.        timer.schedule(new TimerTask() {
18.            public void run() {
19.                System.out.println("-------设定要指定任务--------");
20.            }
21.        }, 2000);// 设定指定的时间time,此处为2000毫秒
22.    }
23.
24.    // 第⼆种⽅法:设定指定任务task在指定延迟delay后进⾏固定延迟peroid的执⾏
25.    // schedule(TimerTask task, long delay, long period)
26.    public static void timer2() {
27.        Timer timer = new Timer();
28.        timer.schedule(new TimerTask() {
29.            public void run() {
30.                System.out.println("-------设定要指定任务--------");
31.            }
32.        }, 1000, 1000);
java线程池创建的四种33.    }
34.
35.    // 第三种⽅法:设定指定任务task在指定延迟delay后进⾏固定频率peroid的执⾏。
36.    // scheduleAtFixedRate(TimerTask task, long delay, long period)
37.    public static void timer3() {
38.        Timer timer = new Timer();
39.        timer.scheduleAtFixedRate(new TimerTask() {
40.            public void run() {
41.                System.out.println("-------设定要指定任务--------");
42.            }
43.        }, 1000, 2000);
44.    }
45.
46.    // 第四种⽅法:安排指定的任务task在指定的时间firstTime开始进⾏重复的固定速率period执⾏.
47.    // Timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long period)
48.    public static void timer4() {
49.        Calendar calendar = Instance();
50.        calendar.set(Calendar.HOUR_OF_DAY, 12); // 控制时
51.        calendar.set(Calendar.MINUTE, 0);      // 控制分
52.        calendar.set(Calendar.SECOND, 0);      // 控制秒
53.
54.        Date time = Time();        // 得出执⾏任务的时间,此处为今天的12:00:00
55.
56.        Timer timer = new Timer();
57.        timer.scheduleAtFixedRate(new TimerTask() {
58.            public void run() {
59.                System.out.println("-------设定要指定任务--------");
60.            }
61.        }, time, 1000 * 60 * 60 * 24);// 这⾥设定将延时每天固定执⾏
62.    }
63. }
2. Java定时任务可以⽤线程的等待来实现
[java]
1. /**
2.  * 普通thread
3.  * 这是最常见的,创建⼀个thread,然后让它在while循环⾥⼀直运⾏着,
4.  * 通过sleep⽅法来达到定时任务的效果。这样可以快速简单的实现,代码如下:
5.  * @author GT
6.  *
7.  */
8. public class Task1 {
9.    public static void main(String[] args) {
10.        // run in a second
11.        final long timeInterval = 1000;
12.        Runnable runnable = new Runnable() {
13.            public void run() {
14.                while (true) {
15.                    // ------- code for task to run
16.                    System.out.println("Hello !!");
17.                    // ------- ends here
18.                    try {
19.                        Thread.sleep(timeInterval);
20.                    } catch (InterruptedException e) {
21.                        e.printStackTrace();
22.                    }
23.                }
24.            }
25.        };
26.        Thread thread = new Thread(runnable);
27.        thread.start();
28.    }
29. }
3.Java可以⽤urrent.ScheduledExecutorService 来实现定时任务
[java]
1. import urrent.Executors;
2. import urrent.ScheduledExecutorService;
3. import urrent.TimeUnit;
4.
5. /**
6.  *
7.  *
8.  * ScheduledExecutorService是从Java SE5的urrent⾥,做为并发⼯具类被引进的,这是最理想的定时任务实现⽅
式。
9.  * 相⽐于上两个⽅法,它有以下好处:
10.  * 1>相⽐于Timer的单线程,它是通过线程池的⽅式来执⾏任务的
11.  * 2>可以很灵活的去设定第⼀次执⾏任务delay时间
12.  * 3>提供了良好的约定,以便设定执⾏的时间间隔
14.  * 下⾯是实现代码,我们通过ScheduledExecutorService#scheduleAtFixedRate展⽰这个例⼦,通过代码⾥参数的控制,⾸次执
⾏加了delay时间。
15.  *
16.  *
17.  * @author GT
18.  *
19.  */
20. public class Task3 {
21.    public static void main(String[] args) {
22.        Runnable runnable = new Runnable() {
23.            public void run() {
24.                // task to run goes here
25.                System.out.println("Hello !!");
26.            }
27.        };
28.        ScheduledExecutorService service = Executors
29.                .newSingleThreadScheduledExecutor();
30.        // 第⼆个参数为⾸次执⾏的延时时间,第三个参数为定时执⾏的间隔时间
31.        service.scheduleAtFixedRate(runnable, 10, 1, TimeUnit.SECONDS);
32.    }
33. }
4. 定时任务之-Quartz使⽤篇
Quartz是OpenSymphony开源组织在Job scheduling领域⼜⼀个开源项⽬,它可以与J2EE与J2SE应⽤程序相结合也可以单独使⽤。Quartz可以⽤来创建简单或为运⾏⼗个,百个,甚⾄是好⼏万个Jobs这样复杂的⽇程序表。Jobs可以做成标准的组件或 EJBs。
CronTrigger配置格式:
格式: [秒] [分] [⼩时] [⽇] [⽉] [周] [年]
序号说明是否必填允许填写的值允许的通配符
1秒是0-59, - * /
2分是0-59, - * /
3⼩时是0-23, - * /
4⽇是1-31, - * ? / L W
5⽉是1-12 or JAN-DEC, - * /
6周是1-7 or SUN-SAT, - * ? / L #
7年否empty 或 1970-2099, - * /
* 表⽰所有值. 例如:在分的字段上设置 "*",表⽰每⼀分钟都会触发。
?
表⽰不指定值。使⽤的场景为不需要关⼼当前设置这个字段的值。例如:要在每⽉的10号触发⼀个操作,但不关⼼是周⼏,所以需要周位置的那个字段设置为"?" 具体设置为 0 0 0 10* ?
- 表⽰区间。例如 在⼩时上设置 "10-12",表⽰ 10,11,12点都会触发。
, 表⽰指定多个值,例如在周字段上设置 "MON,WED,FRI" 表⽰周⼀,周三和周五触发
/ ⽤于递增触发。如在秒上⾯设置"5/15" 表⽰从5秒开始,每增15秒触发(5,20,35,50)。在⽉字段上设置'1/3'所⽰每⽉1号开始,每隔三天触发⼀次。
L 表⽰最后的意思。在⽇字段设置上,表⽰当⽉的最后⼀天(依据当前⽉份,如果是⼆⽉还会依据是否是润年[leap]), 在周字段上表⽰星期六,相当于"7"或"SAT"。如果在"L"前加上数字,则表⽰该数据的最后⼀个。例如在周字段上设置"6L"这样的格式,则表⽰“本⽉最后⼀个星期五"
W 表⽰离指定⽇期的最近那个⼯作⽇(周⼀⾄周五). 例如在⽇字段上设置"15W",表⽰离每⽉15号最近的那个⼯作⽇触发。如果15号正好是周六,则最近的周五(14号)触发, 如果15号是周未,则最近的下周⼀(16号)触发.如果15号正好在⼯作⽇(周⼀⾄周五),则就在该天触发。如果指定格式为 "1W",它则表⽰每⽉1号往后最近的⼯作⽇触发。如果1号正是周六,则将在3号下周⼀触发。(注,"W"前只能设置具体的数字,不允许区间"-").
⼩提⽰'L'和 'W'可以⼀组合使⽤。如果在⽇字段上设置"LW",则表⽰在本⽉的最后⼀个⼯作⽇触发(⼀般指发⼯资 )
# 序号(表⽰每⽉的第⼏个周⼏),例如在周字段上设置"6#3"表⽰在每⽉的第三个周六.注意如果指定"#5",正好第五周没有周六,则不会触发该配置(⽤在母亲节和⽗亲节再合适不过了)
⼩提⽰周字段的设置,若使⽤英⽂字母是不区分⼤⼩写的 MON 与mon相同.
常⽤⽰例:
0 0 12 * * ?每天12点触发
0 15 10 ? * *每天10点15分触发
0 15 10 * * ?每天10点15分触发
0 15 10 * * ? *每天10点15分触发
0 15 10 * * ? 20052005年每天10点15分触发
0 * 14 * * ?每天下午的 2点到2点59分每分触发
0 0/5 14 * * ?每天下午的 2点到2点59分(整点开始,每隔5分触发)
0 0/5 14,18 * * ?每天下午的 2点到2点59分(整点开始,每隔5分触发)每天下午的 18点到18点59分(整点开始,每隔5分触发)
0 0-5 14 * * ?每天下午的 2点到2点05分每分触发
0 10,44 14 ? 3 WED3⽉分每周三下午的 2点10分和2点44分触发
0 15 10 ? * MON-FRI从周⼀到周五每天上午的10点15分触发
0 15 10 15 * ?每⽉15号上午10点15分触发
0 15 10 L * ?每⽉最后⼀天的10点15分触发
0 15 10 ? * 6L每⽉最后⼀周的星期五的10点15分触发
0 15 10 ? * 6L 2002-2005从2002年到2005年每⽉最后⼀周的星期五的10点15分触发
0 15 10 ? * 6#3每⽉的第三周的星期五开始触发
0 0 12 1/5 * ?每⽉的第⼀个中午开始每隔5天触发⼀次
0 11 11 11 11 ?每年的11⽉11号 11点11分触发(光棍节)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。