定时任务之实现方式
定时任务:字面意思,任务可控,具体的时间由我们来设定,让任务在我们制定的时间按照制定的时间间隔频率来执行
Timer和TimerTask
public void task() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
}
}, (delay)1000, (period)2000);
}
//delay 延迟执行
//period 固定频率重复执行,每过 period 毫秒执行一次;
缺点:不支持多线程,任务串行执行,其中一项任务执行时间过长的话影响到其他任务
抛出异常,唯一的进程挂掉,在Timer下面其他的任务无法执行
ScheduledExecutorService
为了弥补timer的缺陷,提供并发包,具体实现类是:ScheduledThreadPoolExecutor,支持多线程,也能捕获到异常。并发的问题也能解决,线程同时执行且不会互相影响;
在这里我只启用了两个线程,但是存在3个定时任务需要我们去调度执行,实际执行的效果就是两个任务先进行了执行,第三个任务需要等待之前的两个线程中的一个执行完即可
Task task = new Task();
Task1 task1 = new Task1();
Task2 task2 = new Task2();
//启用2个线程
ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);
pool.scheduleWithFixedDelay(task, 0, 2, TimeUnit.SECONDS);
pool.scheduleWithFixedDelay(task1, 0, 3, TimeUnit.SECONDS);
pool.scheduleWithFixedDelay(task2, 0, 3, TimeUnit.SECONDS);
执行的定时任务Task
public class Task extends TimerTask {
@Override
public void run() {
System.out.println("----task start--------"+new Date().