Java定时任务,
分享于 点击 33732 次 点评:15
Java定时任务,
Timer和TimerTask
- Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次。
- TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任务。
一个Timer调度的例子
/*
* @author uv
* @date 2018/10/23 15:17
*
*/
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class JdkSchedule {
private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) {
//创建任务
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println(dateFormat.format(new Date()));
}
};
new Timer().schedule(task, 1000, 5000);
new Timer().schedule(task, new Date(), 5000);
//如果到达下一个时间间隔时任务没有执行完,则任务执行完后立即执行下一个任务
new Timer().scheduleAtFixedRate(task, 1000, 5000);
new Timer().scheduleAtFixedRate(task, new Date(System.currentTimeMillis() - 1000 * 60), 5000);
}
}
delay:延迟执行时间 period:执行任务的时间间隔
- schedule(TimerTask task, long delay, long period)
firstTime:第一次执行的时间,如果时间在当前时间之前,会立即执行一次任务,然后再按照时间间隔执行任务 period:时间间隔
- schedule(TimerTask task, Date firstTime, long period)
delay:延迟执行时间 period:执行任务的时间间隔
firstTime:第一次执行的时间,如果时间在当前时间之前,计算firstTime到当前时间这一段时间内会执行多少次执行任务,然后无间隔地执行该次数的任务(补上之前应该执行的任务),然后再按照当前时间前最近的一次任务为时间起点,执行下一次任务(保证所有任务之间的时间间隔相同)
- cheduleAtFixedRate(TimerTask task, long delay, long period)
- cheduleAtFixedRate(TimerTask task, Date firstTime, long period)
ScheduledExecutorService
/*
* @author uv
* @date 2018/10/23 15:37
*
*/
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
public class scheduledexecutor {
private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) throws ExecutionException, InterruptedException {
//启用2个线程
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);
//scheduleAtFixedRate前一个任务的开始时间与后一个任务的开始时间间隔保持相同
executorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println(dateFormat.format(new Date()));
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, 1, 5, TimeUnit.SECONDS);
//scheduleWithFixedDelay 前一个任务的结束时间与后一个任务的开始时间间隔保持相同
//比如当前一个任务结束的时刻,开始结算间隔时间,如0秒开始执行第一次任务,任务耗时5秒,任务间隔时间3秒,那么第二次任务执行的时间是在第8秒开始。
executorService.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
System.out.println(dateFormat.format(new Date()));
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, 1, 5, TimeUnit.SECONDS);
ScheduledFuture<Integer> schedule = executorService.schedule(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
return 1 + 1;
}
}, 10, TimeUnit.SECONDS);
System.out.println(schedule.get());
}
}
Spring3.0以后自带的task
xml配置
<!--开启任务-->
<task:annotation-driven/>
任务类
@Component
public class Job {
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Scheduled(cron = "0/5 * * * * ?")
public void print() {
System.out.println(dateFormat.format(new Date()));
}
}
- cron:指定cron表达式
- zone: 指定cron表达式运行的时区
- fixedDelay:表示从上一个任务完成开始到下一个任务开始的间隔,单位是毫秒。
- fixedRate:从上一个任务开始到下一个任务开始的间隔,单位是毫秒。
- initialDelay: 任务第一次被调用前的延时,单位毫秒
cron表达式生成器:http://cron.qqe2.com/
相关文章
- 暂无相关文章
用户点评