Java 任务调度

1、普通方式

 1 /**
 2      * 普通thread 
 3      * 这是最常见的,创建一个thread,然后让它在while循环里一直运行着, 
 4      * 通过sleep方法来达到定时任务的效果。这样可以快速简单的实现
 5      */
 6     public static void main(String[] args)
 7     {
 8         
 9         //定时任务1  通过普通线程
10         final long timeInterval = 1000;
11         Runnable runnable = new Runnable(){
12 
13             @Override
14             public void run() 
15             {
16                 while (true)
17                 {
18                     long currentTime = System.currentTimeMillis();
19                     SimpleDateFormat formatter = new SimpleDateFormat("yyyy年-MM月dd日-HH时mm分ss秒");
20                     Date date = new Date(currentTime);
21                     System.out.println("hello,"+formatter.format(date));
22                     try 
23                     {
24                         Thread.sleep(timeInterval);
25                     } 
26                     catch (InterruptedException e) 
27                     {
28                         
29                     }
30                 }
31             }
32             
33         };
34         Thread a = new Thread(runnable);
35         a.start();
36     }
37     

2、Timer和TimerTask

 1 /**
 2      * 于第一种方式相比,优势 1>当启动和去取消任务时可以控制 2>第一次执行任务时可以指定你想要的delay时间
 3      * 在实现时,Timer类可以调度任务,TimerTask则是通过在run()方法里实现具体任务。 Timer实例可以调度多任务,它是线程安全的。
 4      * 当Timer的构造器被调用时,它创建了一个线程,这个线程可以用来调度任务。 
 5      * 缺陷:首先Timer对调度的支持是基于绝对时间的,而不是相对时间,所以它对系统时间的改变非常敏感。其次Timer线程是不会捕获异常的,
 6      * 如果TimerTask抛出的了未检查异常则会导致Timer线程终止,同时Timer也不会重新恢复线程的执行,他会错误的认为整个Timer线程都会取消。
 7      * 同时,已经被安排单尚未执行的TimerTask也不会再执行了,新的任务也不能被调度。故如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。
 8      * @param args
 9      */
10     public static void main(String[] args) 
11     {
12         TimerTask task = new TimerTask(){
13 
14             @Override
15             public void run() {
16                 long currentTime = System.currentTimeMillis();
17                 SimpleDateFormat formatter = new SimpleDateFormat("yyyy年-MM月dd日-HH时mm分ss秒");
18                 Date date = new Date(currentTime);
19                 System.out.println("hello,"+formatter.format(date));
20             }
21             
22         };
23         
24         TimerTask task2 = new TimerTask(){
25 
26             @Override
27             public void run() {
28                 long currentTime = System.currentTimeMillis();
29                 SimpleDateFormat formatter = new SimpleDateFormat("yyyy年-MM月dd日-HH时mm分ss秒");
30                 Date date = new Date(currentTime);
31                 System.out.println("hello2,"+formatter.format(date));
32             }
33             
34         };
35         Timer timer = new Timer();
36         long delay = 0;
37         long intevalPeriod = 1*1000;
38         //timer.scheduleAtFixedRate(task, delay, intevalPeriod);
39         //timer.scheduleAtFixedRate(task2, delay, intevalPeriod);
40         SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
41         Date date;
42         try 
43         {
44             date = sdf.parse("2016-09-27 15:16:00");
45             timer.schedule(task2, date, intevalPeriod);
46         } 
47         catch (ParseException e)
48         {
49             e.printStackTrace();
50         }
51     }

3、java.util.concurrent.ScheduledExecutorService

 1 /**
 2      * ScheduledExecutorService是从Java SE5的java.util.concurrent里,做为并发工具类被引进的,这是最理想的定时任务实现方式。  
 3      * 相比于上两个方法,它有以下好处: 
 4      * 1>相比于Timer的单线程,它是通过线程池的方式来执行任务的  
 5      * 2>可以很灵活的去设定第一次执行任务delay时间 
 6      * 3>提供了良好的约定,以便设定执行的时间间隔
 7      * @param args
 8      */
 9     public static void main(String[] args) 
10     {
11         Runnable runnable = new Runnable(){
12 
13             @Override
14             public void run() {
15                 long currentTime = System.currentTimeMillis();
16                 SimpleDateFormat formatter = new SimpleDateFormat("yyyy年-MM月dd日-HH时mm分ss秒");
17                 Date date = new Date(currentTime);
18                 System.out.println("hello2,"+formatter.format(date));
19             }
20             
21         };
22         ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
23         // 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间  
24         service.scheduleAtFixedRate(runnable,10,1,TimeUnit.SECONDS);
25     }

 4、使用调度框架:quartz 

http://www.quartz-scheduler.org/

原文地址:https://www.cnblogs.com/cac2020/p/5913086.html