源无极

导航

 

前言:

      定时器、计划功能在移动开发领域使用比较多,比如Android 技术

定时任务功能在java中主要使用的就是Timer对象,他在内部还是使用多线程

的方式进行处理,所以它和线程技术还是有非常大的关联。本章重点几下

1.如何实现指定时间执行任务

2.如何实现按指定周期执行任务。

一、定时器Timer的使用

jdk中,Timer类主要负责任务的功能,也就是在指定的时间开始执行某一任务

Timer类的主要作用就是设置计划,但封装任务类确实TimerTask类。

执行计划任务的代码要放在TimerTask类中,因为它是一个抽象类。

方法xchedule( TimerTask task,Date time)

作用是在指定的日期执行某一次任务

(一)执行任务的时间晚于当前时间,在未来执行的效果

package com.it.po.thread12;
import java.util.Date;
import java.util.TimerTask;
public class MyTask1 extends TimerTask{
    @Override
    public void run() {
        System.out.println("执行任务时间 "+new Date());
    }
}

 

package com.it.po.thread12;
import com.it.po.thread05.Task1;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class Run1 {
    public static void main(String[] args) {
         System.out.println("当前时间 "+new Date());
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.SECOND,8);
        Date time = calendar.getTime();
        MyTask1 myTask1 = new MyTask1();
        Timer timer = new Timer();
        timer.schedule(myTask1,time);
    }
}

 

 

当前时间 Tue Dec 10 22:03:44 CST 2019
执行任务时间 Tue Dec 10 22:03:52 CST 2019

 

 注意:程序运行时,一直红色,因为new Timer() 一次创建一个线程。

源码如下

 public Timer() {
        this("Timer-" + serialNumber());
    }
 public Timer(String name) {
        thread.setName(name);
        thread.start();
    }

 

 修改如下

package com.it.po.thread12;
import com.it.po.thread05.Task1;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class Run1 {
    public static void main(String[] args) {
         System.out.println("当前时间 "+new Date());
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.SECOND,8);
        Date time = calendar.getTime();
        MyTask1 myTask1 = new MyTask1();
        Timer timer = new Timer(true);
        timer.schedule(myTask1,time);
    }
}

 

’让其变成了守护线程

 public Timer(boolean isDaemon) {
        this("Timer-" + serialNumber(), isDaemon);
    }
当前时间 Tue Dec 10 22:08:48 CST 2019

Process finished with exit code 0

 

结果只是执行main方法里面的代码,TimerTask代码不被执行。 

 (二)计划时间早于当前时间,提前运行的效果。

 

package com.it.po.thread12;
import java.util.Date;
import java.util.TimerTask;
public class MyTask2 extends TimerTask{
    @Override
    public void run() {
        System.out.println("执行任务时间 "+new Date());
    }
}
package com.it.po.thread12;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class Run2 {
    public static void main(String[] args) {
         System.out.println("当前时间 "+new Date());
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.SECOND,calendar.get(Calendar.SECOND)-5);
        Date time= calendar.getTime();
        System.out.println("计划执行时间 "+time);
        MyTask2 myTask2 = new MyTask2();
        Timer timer = new Timer();
        timer.schedule(myTask2,time);
    }
}

 

 

当前时间 Tue Dec 10 22:14:42 CST 2019
计划执行时间 Tue Dec 10 22:14:37 CST 2019
执行任务时间 Tue Dec 10 22:14:42 CST 2019

 

 (三)、Timer中允许有多个TimerTask 任务以及延时的测试。

 

package com.it.po.thread12;
import java.util.Date;
import java.util.TimerTask;
public class MyTask3 extends TimerTask{
    @Override
    public void run() {
        System.out.println("执行任务时间 "+new Date());
    }
}

 

 

package com.it.po.thread12;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class Run3 {
    public static void main(String[] args) {
         System.out.println("当前时间 "+new Date());
        Calendar calendar1 = Calendar.getInstance();
        calendar1.add(Calendar.SECOND,3);
        Date time1= calendar1.getTime();
        System.out.println("计划执行时间time1 "+time1);
        Calendar calendar2 = Calendar.getInstance();
        calendar2.add(Calendar.SECOND,6);
        Date time2= calendar2.getTime();
        System.out.println("计划执行时间time2 "+time2);
        MyTask3 myTask1 = new MyTask3();
        MyTask3 myTask2 = new MyTask3();
        Timer timer = new Timer();
        timer.schedule(myTask1,time1);
        timer.schedule(myTask2,time2);
    }
}

 

当前时间 Tue Dec 10 22:43:10 CST 2019
计划执行时间time1 Tue Dec 10 22:43:13 CST 2019
计划执行时间time2 Tue Dec 10 22:43:16 CST 2019
执行任务时间 Tue Dec 10 22:43:13 CST 2019
执行任务时间 Tue Dec 10 22:43:16 CST 2019

 

 

 

         TimerTask是以队列的方式一个一个被顺序性执行,所以执行的时间有可能

和预期时间不一致,因为前面的任务可能消耗的时间较长,

后面运行的时间也被拖延。

 

 

 

package com.it.po.thread12;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class Run4 {
    public static void main(String[] args) {
         System.out.println("当前时间 "+new Date());
        Calendar calendar1 = Calendar.getInstance();
        calendar1.add(Calendar.SECOND,1);
        Date time1= calendar1.getTime();
        System.out.println("A 计划执行时间time1 "+time1);
        Calendar calendar2 = Calendar.getInstance();
        calendar2.add(Calendar.SECOND,5);
        Date time2= calendar2.getTime();
        System.out.println("B 计划执行时间time2 "+time2);
        MyTask4A myTask1 = new MyTask4A();
        MyTask4B myTask2 = new MyTask4B();
        Timer timer = new Timer();
        timer.schedule(myTask1,time1);
        timer.schedule(myTask2,time2);
    }
}

 

当前时间 Tue Dec 10 22:50:41 CST 2019
A 计划执行时间time1 Tue Dec 10 22:50:42 CST 2019
B 计划执行时间time2 Tue Dec 10 22:50:46 CST 2019
MyTask4A begin  Tue Dec 10 22:50:42 CST 2019
MyTask4A end  Tue Dec 10 22:50:52 CST 2019
MyTask4B begin  Tue Dec 10 22:50:52 CST 2019
MyTask4B end  Tue Dec 10 22:50:53 CST 2019

 

 

二、方法schedule(TimerTask task ,Date firstTime ,long period )

package com.it.po.thread12;
import java.util.Date;
import java.util.TimerTask;

public class MyTask5 extends TimerTask{
    @Override
    public void run() {
        System.out.println("执行任务时间 "+new Date());
    }
}
package com.it.po.thread12;

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;

public class Run5 {
    public static void main(String[] args) {
        System.out.println("当前时间 "+new Date());
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.SECOND,2);
        Date time = calendar.getTime();
        MyTask1 myTask1 = new MyTask1();
        Timer timer = new Timer();
        timer.schedule(myTask1,time,3000);
    }
}

 

没3s执行一次

当前时间 Tue Dec 10 22:57:21 CST 2019
执行任务时间 Tue Dec 10 22:57:23 CST 2019
执行任务时间 Tue Dec 10 22:57:26 CST 2019
执行任务时间 Tue Dec 10 22:57:29 CST 2019
执行任务时间 Tue Dec 10 22:57:32 CST 2019
执行任务时间 Tue Dec 10 22:57:35 CST 2019
执行任务时间 Tue Dec 10 22:57:38 CST 2019
执行任务时间 Tue Dec 10 22:57:41 CST 2019
执行任务时间 Tue Dec 10 22:57:44 CST 2019
执行任务时间 Tue Dec 10 22:57:47 CST 2019
。。。。

 

 

 

 无限重复执行

(一)、计划时间早于当前时间--提前运行效果

package com.it.po.thread12;
import java.util.Date;
import java.util.TimerTask;
public class MyTask6 extends TimerTask{
    @Override
    public void run() {
        System.out.println("执行任务时间 "+new Date());
    }
}

 

package com.it.po.thread12;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class Run6 {
    public static void main(String[] args) {
        System.out.println("当前时间 "+new Date());
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.SECOND,calendar.get(Calendar.SECOND)-10);
        Date time = calendar.getTime();
        System.out.println("计划执行时间 "+time);
        MyTask6 myTask6 = new MyTask6();
        Timer timer = new Timer();
        timer.schedule(myTask6,time,4000);
    }
}

 

当前时间 Tue Dec 10 23:04:06 CST 2019
计划执行时间 Tue Dec 10 23:03:56 CST 2019
执行任务时间 Tue Dec 10 23:04:06 CST 2019
执行任务时间 Tue Dec 10 23:04:10 CST 2019
执行任务时间 Tue Dec 10 23:04:14 CST 2019
执行任务时间 Tue Dec 10 23:04:18 CST 2019
执行任务时间 Tue Dec 10 23:04:22 CST 2019
执行任务时间 Tue Dec 10 23:04:26 CST 2019
执行任务时间 Tue Dec 10 23:04:30 CST 2019
。。。

 

程序运行后立即执行任务

(二)、任务执行时间被延时

package com.it.po.thread12;
import java.util.Date;
import java.util.TimerTask;
public class MyTask7 extends TimerTask{
    @Override
    public void run() {
        try {
            System.out.println("MyTask7 begin  "+new Date());
            Thread.sleep(5000);
            System.out.println("MyTask7 end  "+new Date());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 

package com.it.po.thread12;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class Run7 {
    public static void main(String[] args) {
         System.out.println("当前时间 "+new Date());
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.SECOND,10);
        Date time= calendar.getTime();
        System.out.println("计划执行时间 "+time);
        MyTask7 myTask7 = new MyTask7();
        Timer timer = new Timer();
        timer.schedule(myTask7,time,3000);
    }
}

 

当前时间 Tue Dec 10 23:09:18 CST 2019
计划执行时间 Tue Dec 10 23:09:28 CST 2019
MyTask7 begin  Tue Dec 10 23:09:28 CST 2019
MyTask7 end  Tue Dec 10 23:09:33 CST 2019
MyTask7 begin  Tue Dec 10 23:09:33 CST 2019
MyTask7 end  Tue Dec 10 23:09:38 CST 2019
MyTask7 begin  Tue Dec 10 23:09:38 CST 2019
MyTask7 end  Tue Dec 10 23:09:43 CST 2019
MyTask7 begin  Tue Dec 10 23:09:43 CST 2019
MyTask7 end  Tue Dec 10 23:09:48 CST 2019
。。。

 

先延时10s执行,虽然设置了3s重复执行,但是执行一次任务需要5s

所以任务执行完又立即执行。

修改如下

package com.it.po.thread12;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class Run7 {
    public static void main(String[] args) {
         System.out.println("当前时间 "+new Date());
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.SECOND,10);
        Date time= calendar.getTime();
        System.out.println("计划执行时间 "+time);
        MyTask7 myTask7 = new MyTask7();
        Timer timer = new Timer();
        timer.schedule(myTask7,time,7000);
    }
}

 

当前时间 Tue Dec 10 23:12:04 CST 2019
计划执行时间 Tue Dec 10 23:12:14 CST 2019
MyTask7 begin  Tue Dec 10 23:12:14 CST 2019
MyTask7 end  Tue Dec 10 23:12:19 CST 2019
MyTask7 begin  Tue Dec 10 23:12:21 CST 2019
MyTask7 end  Tue Dec 10 23:12:26 CST 2019
MyTask7 begin  Tue Dec 10 23:12:28 CST 2019
MyTask7 end  Tue Dec 10 23:12:33 CST 2019
MyTask7 begin  Tue Dec 10 23:12:35 CST 2019
MyTask7 end  Tue Dec 10 23:12:40 CST 2019
MyTask7 begin  Tue Dec 10 23:12:42 CST 2019
MyTask7 end  Tue Dec 10 23:12:47 CST 2019
MyTask7 begin  Tue Dec 10 23:12:49 CST 2019
MyTask7 end  Tue Dec 10 23:12:54 CST 2019
MyTask7 begin  Tue Dec 10 23:12:56 CST 2019
MyTask7 end  Tue Dec 10 23:13:01 CST 2019
posted on 2019-12-10 22:16  源无极  阅读(1060)  评论(0)    收藏  举报