当发送一个任务给执行器时,根据执行器的相应配置,任务将尽可能快的被执行,但是,如果并不想让任务马上被执行,而是想让任务在过一段时间被执行,或者任务能够被周期性的执行。为了达到这个目的,执行器框架提供了ScheduledThreadPoolExecutor类。
executor.schedule(command, delay, unit)
command :runnable 要执行的任务
delay : 延时执行的时间
unit:s时间单位
executor.scheduleWithFixedDelay(command, initialDelay, delay, unit)
command :runnable 要执行的任务
initialDelay: 第一次延时执行的时间
delay:每次任务执行完后的延迟时间 。如果为2,那么下次的执行时间是上次任务执行完后,过2秒钟在执行
unit:时间单位。
import java.util.Date;
import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class STFixedTask implements Runnable{
private String name;
public STFixedTask(String name){
this.name = name;
}
@Override
public void run() {
System.out.println(name+":start "+new Date());
try {
Thread.sleep(new Random().nextInt(10)*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(name+":end "+new Date());
}
public static void main(String[] args) {
ScheduledThreadPoolExecutor executor = (ScheduledThreadPoolExecutor)Executors.newScheduledThreadPool(1);
STFixedTask task = new STFixedTask("Task");
executor.scheduleWithFixedDelay(task, 1, 2, TimeUnit.SECONDS);
}
}
输出结果:
Task:start Mon Jul 30 13:22:07 CST 2018
Task:end Mon Jul 30 13:22:14 CST 2018
Task:start Mon Jul 30 13:22:16 CST 2018
Task:end Mon Jul 30 13:22:16 CST 2018
Task:start Mon Jul 30 13:22:18 CST 2018
Task:end Mon Jul 30 13:22:19 CST 2018
Task:start Mon Jul 30 13:22:21 CST 2018
Task:end Mon Jul 30 13:22:26 CST 2018
每次任务执行完后都延时2秒在执行下秒的任务。
executor.scheduleAtFixedRate(command, initialDelay, period, unit)
command :runnable 要执行的任务
initialDelay: 第一次延时执行的时间
period:执行间隔。下次任务的执行时间为:initialDelay + 2 * period
unit:时间单位。
import java.util.Date;
import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class STFixedTask implements Runnable{
private String name;
public STFixedTask(String name){
this.name = name;
}
@Override
public void run() {
System.out.println(name+":start "+new Date());
try {
Thread.sleep(new Random().nextInt(10)*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(name+":end "+new Date());
}
public static void main(String[] args) {
ScheduledThreadPoolExecutor executor = (ScheduledThreadPoolExecutor)Executors.newScheduledThreadPool(1);
STFixedTask task = new STFixedTask("Task");
//executor.scheduleWithFixedDelay(task, 1, 2, TimeUnit.SECONDS);
executor.scheduleAtFixedRate(task, 1, 2, TimeUnit.SECONDS);
}
}
输出结果:
Task:start Mon Jul 30 13:17:58 CST 2018
Task:end Mon Jul 30 13:18:00 CST 2018
Task:start Mon Jul 30 13:18:00 CST 2018
Task:end Mon Jul 30 13:18:06 CST 2018
Task:start Mon Jul 30 13:18:06 CST 2018
Task:end Mon Jul 30 13:18:06 CST 2018
Task:start Mon Jul 30 13:18:06 CST 2018
可以看出如果当前时间超过initialDelay + 2 * period 会立马执行。