为什么那么多人建网站做博客,天津logo设计公司,合肥建工学校,国内设计大神网站文章目录一、基础知识1. 简介2. 常用API二、需求案例2.1. 案例12.2. 案例22.3. 案例3三、场景案例3.1. 在特定时间执行任务#xff0c;只执行一次3.2. 指定第一次执行的时间#xff0c;然后按照间隔时间#xff0c;重复执行在开发中#xff0c;我们经常需要一些周期性的操作…
文章目录一、基础知识1. 简介2. 常用API二、需求案例2.1. 案例12.2. 案例22.3. 案例3三、场景案例3.1. 在特定时间执行任务只执行一次3.2. 指定第一次执行的时间然后按照间隔时间重复执行在开发中我们经常需要一些周期性的操作例如每隔几分钟就进行某一项操作。这时候我们就要去设置个定时器Java中最方便、最高效的实现方式是用java.util.Timer工具类再通过调度java.util.TimerTask任务。
一、基础知识
1. 简介
Timer是一种工具线程用其安排以后在后台线程中执行的任务。可安排任务执行一次或者定期重复执行。实际上是个线程定时调度所拥有的TimerTasks。 TimerTask是一个抽象类它的子类由 Timer 安排为一次执行或重复执行的任务。实际上就是一个拥有run方法的类需要定时执行的代码放到run方法体内。
2. 常用API
//以下是几种常用调度task的方法 timer.schedule(task, time);
// time为Date类型在指定时间执行一次。 timer.schedule(task, firstTime, period);
// firstTime为Date类型,period为long
// 从firstTime时刻开始每隔period毫秒执行一次。 timer.schedule(task, delay)
// delay 为long类型从现在起过delay毫秒执行一次 timer.schedule(task, delay, period)
// delay为long,period为long从现在起过delay毫秒以后每隔period
// 毫秒执行一次。二、需求案例
2.1. 案例1
每天定时12:00执行操作延迟3分钟后再执行第1步:写一个处理类使用timer.schedule(task, firstTime, period);api
package com.gblfy.test;import java.util.Calendar;
import java.util.Date;
import java.util.Timer;public class G {/*** 每天定时12:00执行操作延迟3分钟后再执行*/public void timer(){Calendar calendar Calendar.getInstance();calendar.set(Calendar.HOUR_OF_DAY, 12);//控制小时calendar.set(Calendar.MINUTE, 0);//控制分钟calendar.set(Calendar.SECOND, 0);//控制秒Date time calendar.getTime();//执行任务时间为12:00:00Timer timer new Timer();timer.schedule(new TimerTaskTest2(),60 * 3 * 1000);}
}第2步:写一个类extends TimerTask实现run方法在方法内部写需要执行的代码
package com.gblfy.test;import java.util.TimerTask;public class TimerTaskTest2 extends TimerTask {Overridepublic void run() {System.out.println(... //每次需要执行的代码放到这里面);}
}另一种形式不是输出一句话而是在run方法内部调用一个自定义方法
package com.gblfy.test;import java.util.TimerTask;public class TimerTaskTest2 extends TimerTask {Overridepublic void run() {System.out.println(... //每次需要执行的代码放到这里面);Submit();}private void Submit() {System.out.println(-------------自定义方法-------------);}
}
2.2. 案例2
每天定时12:00执行操作延迟3分钟后再执行但是我需要传参怎样办第1步
package com.gblfy.test;import java.util.Calendar;
import java.util.Date;
import java.util.Timer;public class A {public void timer(String tokenNo) {Calendar calendar Calendar.getInstance();calendar.set(Calendar.HOUR_OF_DAY, 12);//控制小时calendar.set(Calendar.MINUTE, 0);//控制分钟calendar.set(Calendar.SECOND, 0);//控制秒Date time calendar.getTime();//执行任务时间为12:00:00Timer timer new Timer();//每天定时12:00执行操作延迟3分钟后再执行// timer.schedule(new TimerTaskTest(tokenNo),time,60 * 3 * 1000);// timer.schedule(new TimerTaskTest(tokenNo),60 * 3 * 1000);timer.schedule(new TimerTaskTest(tokenNo), 1 * 1000);}public static void main(String[] args) {A a new A();String tokenNo123;a.timer(tokenNo);}
}
第2步
package com.gblfy.test;import java.util.TimerTask;public class TimerTaskTest extends TimerTask {private String tokenNo;public TimerTaskTest(String tokenNo) {this.tokenNo tokenNo;}/*** 此计时器任务要执行的操作。*/Overridepublic void run() {Submit(tokenNo);System.out.println(-------30分钟之后执行指定时间time执行--------);}public void Submit(String tokenNo) {System.out.println(1111111111tokenNo);}
}
2.3. 案例3
延迟3分钟后再执行但是我需要传参怎样办只需要烧写一个参数即可 // timer.schedule(new TimerTaskTest(tokenNo),60 * 3 * 1000);为了方便测试可以写成3秒 timer.schedule(new TimerTaskTest(tokenNo), 3 * 1000);三、场景案例
3.1. 在特定时间执行任务只执行一次
package com.gblfy.test;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;public class TimerTime {/*** p* 1.停止timer* timer.cancel();* 2.在特定时间执行任务只执行一次* public void schedule(TimerTask task,Date time)* /p** param args* throws Exception*/public static void main(String[] args) throws Exception {new TimerTime().new Time().start();}// 时间格式SimpleDateFormat sdf new SimpleDateFormat(yyyy/MM/dd HH:mm:ss);// 要执行的时间参数Date dateTime new Date(2016/8/13 10:56:00);// 内部类继承线程 创建一个新线程。class Time extends Thread {Overridepublic void run() {final Timer timer new Timer();timer.schedule(new TimerTask() {// 重写run方法Overridepublic void run() {System.out.println(I am a cat);timer.cancel();}}, dateTime);}}
}3.2. 指定第一次执行的时间然后按照间隔时间重复执行
package com.gblfy.test;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;public class TimerTime {/*** p* 1.停止timer* timer.cancel();* 2.在特定时间执行任务只执行一次* public void schedule(TimerTask task,Date time)* /p** param args* throws Exception*/public static void main(String[] args) throws Exception {new TimerTime().new Time().start();}// 时间格式SimpleDateFormat sdf new SimpleDateFormat(yyyy/MM/dd HH:mm:ss);// 要执行的时间参数Date dateTime new Date(2016/8/13 10:56:00);// 内部类继承线程 创建一个新线程。class Time extends Thread {Overridepublic void run() {final Timer timer new Timer();timer.schedule(new TimerTask() {// 重写run方法Overridepublic void run() {System.out.println(I am a cat);timer.cancel();}}, dateTime);}}/*** 指定第一次执行的时间然后按照间隔时间重复执行* public void schedule(TimerTask task,Date firstTime,long period)** param task* param firstTime* param period*/public void schedule(TimerTask task, Date firstTime, long period)// 示例// 参照上面的代码多传一个时间间隔参数period单位毫秒class Time2 extends Thread {Overridepublic void run() {final Timer timer new Timer();timer.schedule(new TimerTask() {// 重写run方法Overridepublic void run() {System.out.println(I am a cat);timer.cancel();}}, dateTime,1000 * 1);}}
}