文章目录
方法schedule(TimerTask task,Date time)
该方法的作用就是在指定日期执行一次某任务。执行任务的时间晚于当前时间:在未来执行的效果。
package multiply.com.test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Run1 {
private static Timer timer = new Timer();
public static void main(String[] args) throws ParseException {
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("运行了,时间为:" + new Date());
}
};
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = "2021-10-31 17:57:00";
Date date = sdf.parse(dateString);
System.out.println("dateString : " + date.toLocaleString() + " CurrentDate : " + new Date().toLocaleString());
timer.schedule(task, date);
}
}
查看构造方法可以得知,创建一个Timer就是启动一个新的线程,这个新启动的线程并不是守护线程,它一直在运行。
下一步将新创建的Timer改成守护线程。
package multiply.com.test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Run1TimerIsDaemon {
private static Timer timer = new Timer(true);
public static void main(String[] args) throws ParseException {
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("运行了,时间为:" + new Date());
}
};
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = "2021-10-31 17:55:00";
Date date = sdf.parse(dateString);
System.out.println("dateString : " + date.toLocaleString() + " CurrentDate : " + new Date().toLocaleString());
timer.schedule(task, date);
}
}
dateString : 2021 Oct 31 18:00:20 CurrentDate : 2021 Oct 31 18:00:10
程序运行后迅速结束当前的进程,并且 TimerTask中的任务不再被运行,因为进程已经结束了。
计划时间早于当前时间:提前运行的效果。如果执行任务的时间早于当前时间,则立即执行task任务。
TimerTask是以队列的方式一个一个被顺序执行的,所以执行的时间有可能和预期的时间不一致,因为前面的任务有可能消耗的时间较长,则后面的任务运行的时间也会被延迟
方法schedule(TimerTask task,Date firstTime,long period)
该方法是在指定日期后,按照指定的间隔周期性地无限循环地执行某一任务。
- 1计划时间晚于当前时间:在未来执行的效果。
- 2计划时间早于当前时间:提前运行的效果。如果计划时间早于当前时间,则立即执行task任务。
package multiply.com.test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Run {
public static void main(String[] args) throws ParseException {
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("运行了,时间为:" + new Date());
}
};
Timer timer = new Timer();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = "2021-11-1 10:21:00";
Date date = sdf.parse(dateString);
System.out.println("dateString : " + date.toLocaleString() + " CurrentDate : " + new Date().toLocaleString());
timer.schedule(task, date, 4000);
}
}
3.任务执行时间被延时
package multiply.com.test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Run2_1 {
public static void main(String[] args) throws ParseException {
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("A运行了,时间为: " + new Date());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("A结束了,时间为: " + new Date());
}
};
Timer timer = new Timer();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = "2021-11-1 10:28:00";
Date date = sdf.parse(dateString);
System.out.println("dateString : " + date.toLocaleString() + " CurrentDate : " + new Date().toLocaleString());
timer.schedule(task, date,4000);
}
}
4.TimerTask类的cancel()方法。TimerTask类中的cancel()方法的作用是将自身从任务队列中清除。
package multiply.com.test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Run2 {
public static void main(String[] args) throws ParseException {
Timer timer = new Timer();
TimerTask task1 = new TimerTask() {
private int count = 0;
@Override
public void run() {
System.out.println("A运行了,时间为: " + new Date());
count++;
if (count == 5) {
this.cancel();
}
}
};
TimerTask task2 = new TimerTask() {
@Override
public void run() {
System.out.println("B运行了,时间为: " + new Date());
}
};
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = "2021-11-1 10:38:00";
Date date = sdf.parse(dateString);
System.out.println("dateString : " + date.toLocaleString() + " CurrentDate : " + new Date().toLocaleString());
timer.schedule(task1, date, 4000);
timer.schedule(task2, date, 4000);
}
}
5.Timer类的cancel()方法:和TimerTask类中的cancel()方法清除自身不同,Timer类中的cancel()方法的作用是将任务队列中的全部任务清空。
方法schedule(TimerTask task,long delay)
以当前的时间为参考时间,在此时间基础上延迟指定的毫秒数后执行一次TimerTask任务。
方法schedule(TimerTask task,long delay,long period)
该方法的作用是以执行schedule ( TimerTask task, long delay, long period)方法当前的时间为参考时间,在此时间基础上延迟指定的毫秒数,再以某一间隔时间无限次数地执行某一任务。
方法scheduleAtFixedRate(TimerTask task,Date firstTime,long period)
测试scheduleAtFixedRate方法任务不延时
package multiply.com.test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Run3 {
public static void main(String[] args) throws ParseException {
Timer timer = new Timer();
TimerTask task = new TimerTask() {
private int count = 0;
@Override
public void run() {
System.out.println("1 Begin 运行了,时间为:" + new Date());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("1 End 运行了,时间为:" + new Date());
count++;
if (count == 5) {
timer.cancel();
}
}
};
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString1 = "2021-11-1 11:04:00";
Date date1 = sdf.parse(dateString1);
System.out.println("dateString 1 : " + date1.toLocaleString() + " CurrentDate : " + new Date().toLocaleString());
timer.scheduleAtFixedRate(task, date1, 3000);
}
}
测试scheduleAtFixedRate方法任务延时
package multiply.com.test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Run4 {
public static void main(String[] args) throws ParseException {
Timer timer = new Timer();
TimerTask task = new TimerTask() {
private int count = 0;
@Override
public void run() {
System.out.println("1 Begin 运行了,时间为:" + new Date());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("1 End 运行了,时间为:" + new Date());
count++;
if (count == 5) {
timer.cancel();
}
}
};
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString1 = "2021-11-1 11:08:00";
Date date1 = sdf.parse(dateString1);
System.out.println("dateString 1 : " + date1.toLocaleString() + " CurrentDate : " + new Date().toLocaleString());
timer.scheduleAtFixedRate(task, date1, 2000);
}
}