源无极

导航

 

一、TimerTask类的cancel方法

该方法的cancel作用是将自身从任务队列中进行清除

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

 

当前时间 Thu Dec 12 22:55:50 CST 2019
计划执行时间 Thu Dec 12 22:55:50 CST 2019
MyTask8A run  Thu Dec 12 22:55:50 CST 2019
MyTask8A 停了自己  Thu Dec 12 22:55:50 CST 2019
MyTask8B run  Thu Dec 12 22:55:50 CST 2019
MyTask8B run  Thu Dec 12 22:55:53 CST 2019
MyTask8B run  Thu Dec 12 22:55:56 CST 2019
MyTask8B run  Thu Dec 12 22:55:59 CST 2019
MyTask8B run  Thu Dec 12 22:56:02 CST 2019

 

 二、Timer类的cancel()

该方法作用是将任务队列中全部的任务进行清空

 

 

 

package com.it.po.thread12;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;

public class Run8 {
    public static void main(String[] args) throws InterruptedException {
         System.out.println("当前时间 "+new Date());
        Calendar calendar = Calendar.getInstance();
        Date time= calendar.getTime();
        System.out.println("计划执行时间 "+time);
        MyTask8A myTask1 = new MyTask8A();
        MyTask8B myTask2 = new MyTask8B();
        Timer timer = new Timer();
        timer.schedule(myTask1,time,2000);
        timer.schedule(myTask2,time,2000);
        Thread.sleep(8000);
        timer.cancel();
    }
}

 

当前时间 Thu Dec 12 23:03:09 CST 2019
计划执行时间 Thu Dec 12 23:03:09 CST 2019
MyTask8A run  Thu Dec 12 23:03:09 CST 2019
MyTask8B run  Thu Dec 12 23:03:09 CST 2019
MyTask8B run  Thu Dec 12 23:03:11 CST 2019
MyTask8A run  Thu Dec 12 23:03:11 CST 2019
MyTask8A run  Thu Dec 12 23:03:13 CST 2019
MyTask8B run  Thu Dec 12 23:03:13 CST 2019
MyTask8B run  Thu Dec 12 23:03:15 CST 2019
MyTask8A run  Thu Dec 12 23:03:15 CST 2019
MyTask8A run  Thu Dec 12 23:03:17 CST 2019

 

任务结束。

三、Timer类的cancel方法注意事项。

(一)Timer的cancel方法有时不一定会停止线程。

package com.it.po.thread12;
import java.util.Date;
import java.util.TimerTask;
public class MyTask9 extends TimerTask{
    private int i;
    public MyTask9(int i) {
        this.i = i;
    }
    @Override
    public void run() {
        System.out.println("" + i+ "次没有被cancel取消  ");
    }
}

 

 

package com.it.po.thread12;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;

public class Run9 {
    public static void main(String[] args) throws InterruptedException {
        int i=0;
         System.out.println("当前时间 "+new Date());
        Calendar calendar = Calendar.getInstance();
        Date time= calendar.getTime();
       while (true){
           i++;
           MyTask9 myTask1 = new MyTask9(i);
           Timer timer = new Timer();
           timer.schedule(myTask1,time);
           timer.cancel();
       }


    }
}

 

 

当前时间 Thu Dec 12 23:12:20 CST 2019
第 17941次没有被cancel取消  
第 17953次没有被cancel取消  
第 17958次没有被cancel取消  

 

原因是Timer类的cancel方法有时候并没有争抢到queue锁,则让TimerTask类

中的任务正常执行。 

 (二)、方法schedule(TimerTask task,long delay)

          该方法的作用是以执行schedule(TimerTask task,long delay)

方法当前的时间为参考时间,在此时间基础上延迟指定的

毫秒数后执行一次TimerTask任务。

 

package com.it.po.thread12;
import java.util.Date;
import java.util.TimerTask;
public class MyTask10 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 Run10 {
    public static void main(String[] args) throws InterruptedException {
        MyTask10 myTask10 = new MyTask10();
        Timer timer = new Timer();
        System.out.println("当前时间 "+new Date());
        timer.schedule(myTask10,5000);//在当前时间基础上延迟5s执行任务
    }
}
当前时间 Thu Dec 12 23:22:56 CST 2019
执行任务时间 Thu Dec 12 23:23:01 CST 2019

 

 

 (三) 方法schedule(TimerTask task,long delay  long period)

      该方法的作用是以执行schedule(TimerTask task,long delay  long period)

方法当前的时间为参考时间,在此时间基础上延迟指定的

毫秒数后,再以某一间隔时间无限次数地执行某一任务。

package com.it.po.thread12;
import java.util.Date;
import java.util.TimerTask;
public class MyTask10 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 Run10 {
    public static void main(String[] args) throws InterruptedException {
        MyTask10 myTask10 = new MyTask10();
        Timer timer = new Timer();
        System.out.println("当前时间 "+new Date());
        //在当前时间基础上延迟2s,再3s执行一次任务
        timer.schedule(myTask10,2000,3000);
    }
}
当前时间 Thu Dec 12 23:27:54 CST 2019
执行任务时间 Thu Dec 12 23:27:56 CST 2019
执行任务时间 Thu Dec 12 23:27:59 CST 2019
执行任务时间 Thu Dec 12 23:28:02 CST 2019
执行任务时间 Thu Dec 12 23:28:05 CST 2019
执行任务时间 Thu Dec 12 23:28:08 CST 2019
执行任务时间 Thu Dec 12 23:28:11 CST 2019

 

。。。。

 四、 方法scheduleAtFixedRate(TimerTask task, Date  firstTime ,long period)

方法schedule和scheduleAtFixedRate都会按顺序执行,所以不要担心非线程

安全的问题。

 方法schedule和scheduleAtFixedRate主要区别在于:没有追赶性

(一)schedule方法任务不延时--Date类型

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

 

 

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

 

 

当前时间 Thu Dec 12 23:47:47 CST 2019
MyTask11 begin 1576165667683
MyTask11 end 1576165668683
MyTask11 begin 1576165670683
MyTask11 end 1576165671683
MyTask11 begin 1576165673683
MyTask11 end 1576165674683
MyTask11 begin 1576165676684
MyTask11 end 1576165677684

 

 。。。

 以上是不延时的特点。

 (二)schedule方法任务不延时---long类型

 上面的例子只需要修改main方法

package com.it.po.thread12;
import java.util.Date;
import java.util.TimerTask;
public class MyTask11 extends TimerTask{
    @Override
    public void run() {
        try {
            System.out.println("MyTask11 begin "+System.currentTimeMillis());
            Thread.sleep(1000);
            System.out.println("MyTask11 end "+System.currentTimeMillis());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
package com.it.po.thread12;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class Run11 {
    public static void main(String[] args) {
         System.out.println("当前时间 "+new Date());
        MyTask11 myTask1 = new MyTask11();
        Timer timer = new Timer();
        timer.schedule(myTask1,3000,4000);
    }
}

 

 

当前时间 Thu Dec 12 23:52:30 CST 2019
MyTask11 begin 1576165953749
MyTask11 end 1576165954749
MyTask11 begin 1576165957750
MyTask11 end 1576165958750
MyTask11 begin 1576165961750
MyTask11 end 1576165962750
MyTask11 begin 1576165965750
MyTask11 end 1576165966750

 

 (三)schedule方法任务延时--Date类型

 

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

public class MyTask12 extends TimerTask{
    @Override
    public void run() {
        try {
            System.out.println("执行任务时间 begin "+System.currentTimeMillis());
            Thread.sleep(5000);
            System.out.println("执行任务时间 end "+System.currentTimeMillis());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
package com.it.po.thread12;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;

public class Run12 {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        Date time= calendar.getTime();
        MyTask12 myTask = new MyTask12();
        Timer timer = new Timer();
        timer.schedule(myTask,time,2000);
    }
}

 

 

执行任务时间 begin 1576250549052
执行任务时间 end 1576250554053
执行任务时间 begin 1576250554053
执行任务时间 end 1576250559053
执行任务时间 begin 1576250559053
执行任务时间 end 1576250564053

 

。。。 

 由于休眠5两秒循环一次偶读时间早过了,

 

  (四)schedule方法任务延时--long类型

 上面仅仅修改main方法

package com.it.po.thread12;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;

public class Run12 {
    public static void main(String[] args) {
        MyTask12 myTask = new MyTask12();
        Timer timer = new Timer();
        timer.schedule(myTask,3000,2000);
    }
}

 

 

执行任务时间 begin 1576250750263
执行任务时间 end 1576250755263
执行任务时间 begin 1576250755263
执行任务时间 end 1576250760263
执行任务时间 begin 1576250760263
执行任务时间 end 1576250765264
执行任务时间 begin 1576250765264
执行任务时间 end 1576250770284

 

 休眠期间,延期时间已过

 修改

public static void main(String[] args) {
        MyTask12 myTask = new MyTask12();
        Timer timer = new Timer();
        timer.schedule(myTask,6000,2000);
    }

 

 

执行任务时间 begin 1576250908409
执行任务时间 end 1576250913409
执行任务时间 begin 1576250913409
执行任务时间 end 1576250918409
执行任务时间 begin 1576250918409
执行任务时间 end 1576250923410

 

 延时的情况下,如果执行任务的时间被延时,那么下一次任务的执行时间是以上一次任务

“ 结束 ” 时的时间作为参考的。

 (五)scheduleAtFixedRate 方法任务不延时--Date类型

 

package com.it.po.thread12;
import java.util.TimerTask;
public class MyTask13 extends TimerTask{
    @Override
    public void run() {
        try {
            System.out.println("执行任务时间 begin "+System.currentTimeMillis());
            Thread.sleep(1000);
            System.out.println("执行任务时间 end "+System.currentTimeMillis());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 

 

package com.it.po.thread12;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class Run13 {
    public static void main(String[] args) {
        MyTask13 myTask = new MyTask13();
        Calendar instance = Calendar.getInstance();
        Date time = instance.getTime();
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(myTask,time,3000); } }

 

不延时的情况下,如果执行任务的时间没有被延时,

     则下一次执行的时间是上一次任务的开始加period

执行任务时间 begin 1576251405369
执行任务时间 end 1576251406369
执行任务时间 begin 1576251408370
执行任务时间 end 1576251409370
执行任务时间 begin 1576251411370
执行任务时间 end 1576251412370
执行任务时间 begin 1576251414370
执行任务时间 end 1576251415370

 

。。。

 (六)scheduleAtFixedRate 方法任务不延时--long类型 

修改main方法即可

package com.it.po.thread12;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;

public class Run13 {
    public static void main(String[] args) {
        MyTask13 myTask = new MyTask13();
        System.out.println("当前时间 "+System.currentTimeMillis());
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(myTask,3000,4000);
    }
}

 

当前时间 1576251878746
执行任务时间 begin 1576251881749
执行任务时间 end 1576251882749
执行任务时间 begin 1576251885748
执行任务时间 end 1576251886748
执行任务时间 begin 1576251889748
执行任务时间 end 1576251890748

 

 

六、验证追赶性和不追赶性。

(一)、schedule

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

public class MyTask14 extends TimerTask{
    @Override
    public void run() {
        System.out.println("MyTask14 begin "+new Date());
        System.out.println("MyTask14 end "+new Date());
    }
}
package com.it.po.thread12;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class Run14 {
    public static void main(String[] args) {
        MyTask14 myTask = new MyTask14();
        System.out.println("当前时间 "+System.currentTimeMillis());
        Calendar instance = Calendar.getInstance();
        instance.set(Calendar.SECOND,instance.get(Calendar.SECOND)-20);
        Date time = instance.getTime();
        System.out.println("计划执行时间  "+time);
        Timer timer = new Timer();
        timer.schedule(myTask,time,2000);
    }
}

 

当前时间 1576253324578
计划执行时间  Sat Dec 14 00:08:24 CST 2019
MyTask14 begin Sat Dec 14 00:08:44 CST 2019
MyTask14 end Sat Dec 14 00:08:44 CST 2019
MyTask14 begin Sat Dec 14 00:08:46 CST 2019
MyTask14 end Sat Dec 14 00:08:46 CST 2019
MyTask14 begin Sat Dec 14 00:08:48 CST 2019
MyTask14 end Sat Dec 14 00:08:48 CST 2019
MyTask14 begin Sat Dec 14 00:08:50 CST 2019
MyTask14 end Sat Dec 14 00:08:50 CST 2019
MyTask14 begin Sat Dec 14 00:08:52 CST 2019
MyTask14 end Sat Dec 14 00:08:52 CST 2019
MyTask14 begin Sat Dec 14 00:08:54 CST 2019
MyTask14 end Sat Dec 14 00:08:54 CST 2019
MyTask14 begin Sat Dec 14 00:08:56 CST 2019
MyTask14 end Sat Dec 14 00:08:56 CST 2019
MyTask14 begin Sat Dec 14 00:08:58 CST 2019
MyTask14 end Sat Dec 14 00:08:58 CST 2019
MyTask14 begin Sat Dec 14 00:09:00 CST 2019
MyTask14 end Sat Dec 14 00:09:00 CST 2019
MyTask14 begin Sat Dec 14 00:09:02 CST 2019

 

Task任务不追赶

(二)、scheduleAtFixedRate

package com.it.po.thread12;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class Run14 {
    public static void main(String[] args) {
        MyTask14 myTask = new MyTask14();
        System.out.println("当前时间 "+System.currentTimeMillis());
        Calendar instance = Calendar.getInstance();
        instance.set(Calendar.SECOND,instance.get(Calendar.SECOND)-20);
        Date time = instance.getTime();
        System.out.println("计划执行时间  "+time);
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(myTask,time,2000);
    }
}

 

当前时间 1576253496008
计划执行时间  Sat Dec 14 00:11:16 CST 2019
MyTask14 begin Sat Dec 14 00:11:36 CST 2019
MyTask14 end Sat Dec 14 00:11:36 CST 2019
MyTask14 begin Sat Dec 14 00:11:36 CST 2019
MyTask14 end Sat Dec 14 00:11:36 CST 2019
MyTask14 begin Sat Dec 14 00:11:36 CST 2019
MyTask14 end Sat Dec 14 00:11:36 CST 2019
MyTask14 begin Sat Dec 14 00:11:36 CST 2019
MyTask14 end Sat Dec 14 00:11:36 CST 2019
MyTask14 begin Sat Dec 14 00:11:36 CST 2019
MyTask14 end Sat Dec 14 00:11:36 CST 2019
MyTask14 begin Sat Dec 14 00:11:36 CST 2019
MyTask14 end Sat Dec 14 00:11:36 CST 2019
MyTask14 begin Sat Dec 14 00:11:36 CST 2019
MyTask14 end Sat Dec 14 00:11:36 CST 2019
MyTask14 begin Sat Dec 14 00:11:36 CST 2019
MyTask14 end Sat Dec 14 00:11:36 CST 2019
MyTask14 begin Sat Dec 14 00:11:36 CST 2019
MyTask14 end Sat Dec 14 00:11:36 CST 2019
MyTask14 begin Sat Dec 14 00:11:36 CST 2019
MyTask14 end Sat Dec 14 00:11:36 CST 2019
MyTask14 begin Sat Dec 14 00:11:36 CST 2019
MyTask14 end Sat Dec 14 00:11:36 CST 2019

 

任务补充性的进行。

posted on 2019-12-12 23:02  源无极  阅读(291)  评论(0)    收藏  举报