1、public ScheduledFuture<?> schedule(Runnable command,long delay,TimeUnit unit);
用来创建延迟指定时间后执行某个任务的操作,一次性执行任务,执行完成后结束。
command:等待被执行的任务
delay:任务执行延迟时间
unit:时间单位
运行结果(延迟10秒执行):
2、public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay,long period,TimeUnit unit);
用来创建并执行一个延迟指定初始化时间的任务操作,周期性执行;在initialDelay后首次执行,然后initialDelay+period,initialDelay+2*period,以此类推。如果任务执行的时间小于period,则按照上面的规则执行任务,反之,任务顺延,以任务实际执行的时间来进行周期执行。
command:等待被执行的任务
initialDelay:任务初始延迟执行时间
period:任务执行间隔周期
unit:时间单位
运行结果(延迟10秒,任务执行时间>period):
运行结果(延迟10秒,任务执行时间<period):
3、public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,long initialDelay, long delay,TimeUnit unit);
用来创建并执行一个延迟指定初始化时间的任务操作,周期性执行;在initialDelay后首次执行,然后每一次执行终止和下一次的任务执行开始之间都存在delay的时间延迟,如果任务的执行时间超过延迟时间delay,则下一个任务会在任务执行时间+delay后执行
command:等待被执行的任务
initialDelay:任务初始延迟执行时间
delay:延迟时间
unit:时间单位
运行结果(延迟10秒,任务执行时间>delay):
运行结果(延迟10秒,任务执行时间<delay):
代码参考:
package org.qinghua.concurrent;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* Created by renqinghua on 2017/9/8.
*/
public class ScheduleExcutorServiceTest {
public static void main(String[] args) {
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
MyScheduleThread myScheduleThread = new MyScheduleThread("MyScheduleThread");
System.out.println("线程:" + Thread.currentThread().getName() + ",执行时间:" + myScheduleThread.paraseDate());
//scheduledExecutorService.schedule(myScheduleThread, 10, TimeUnit.SECONDS);
//scheduledExecutorService.scheduleAtFixedRate(myScheduleThread, 10, 2, TimeUnit.SECONDS);
//scheduledExecutorService.scheduleAtFixedRate(myScheduleThread, 10, 6, TimeUnit.SECONDS);
//scheduledExecutorService.scheduleWithFixedDelay(myScheduleThread,10, 2, TimeUnit.SECONDS);
scheduledExecutorService.scheduleWithFixedDelay(myScheduleThread, 10, 6, TimeUnit.SECONDS);
}
static class MyScheduleThread extends Thread {
private String threadName;
public MyScheduleThread(String threadName) {
this.threadName = threadName;
}
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String startTime = paraseDate();
System.out.println("线程:" + threadName + ",执行时间:" + startTime);
}
private String paraseDate() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(new Date());
}
}
}