Java 中的定时任务(一)

 定时任务简单来说就是在指定时间,指定的频率来执行一个方法,而在 Java 中我们又该如何实现呢?

 

想来主要有 3 种方式,最原始的方式肯定是开启一个线程,让它睡一会跑一次睡一会跑一次这也就达到了定频率的执行 run 方法,我们只需要将业务逻辑写在 run 方法中即可。这种方式总结就是单个线程来执行单个任务。

方式一:创建一个线程

 

复制代码
package com.yu.task;  import java.util.Date;  public class ThreadTest {      public static void main(String[] args) {         // 设置执行周期        final long timeInterval = 3000;                  Runnable runnable = new Runnable() {             public void run() {                 while (true) {                     System.out.println("Task Run ... " + new Date());                                          try {                         Thread.sleep(timeInterval);                     } catch (InterruptedException e) {                         e.printStackTrace();                     }                 }             }         };         Thread thread = new Thread(runnable);         thread.start();     } }
复制代码

 

第二种方式:使用 JDK 自带的 API Timer 以及 TaskTimer。 

这种方式和第一种简单粗暴的方式有什么区别呢,主要体现在使用 API 可以在指定的时间开始启动任务,可以延期执行首次任务,同样也看可以设置一定的时间间隔,但是原理是是一样的,后台还是启动了一个线程,应该说是只有一个线程在执行任务,不管我们启动的 Task 有几个。所以这也会有问题,比方说一个一个任务没有执行完成,另一个任务就开始执行了,可能会发生并发问题。还有若是一个任务中报错,则线程就会被停止。

 

复制代码
package com.yu.task;  import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask;  public class MyTask extends TimerTask{      private String name;          public MyTask(String name) {         this.name = name;     }      public String getName() {         return name;     }      public void setName(String name) {         this.name = name;     }      @Override     public void run() {         SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");         String format = sf.format(new Date());         System.out.println("exec MyTask ... 当前时间为:" + format);         System.out.println(this.name +" 正在执行!" + sf.format(new Date()));     }          public static void main(String[] args) {         Timer timer = new Timer();         TimerTask task1 = new MyTask("Tasks 1");         TimerTask task2 = new MyTask("Tasks 2");                  Calendar calendar1 = Calendar.getInstance();         calendar1.add(Calendar.SECOND, 3);         Calendar calendar2 = Calendar.getInstance();         calendar2.add(Calendar.SECOND, 5);                  SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");         String format = sf.format(new Date());         System.out.println("当前时间为:" + format);                  timer.schedule(task1, c
                    
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信