java定时任务三种方法

第一种:Timer 是jdk原生定时工具,位于java.util包

public class TestController {
    public static void main(String[] args){
        Timer timer = new Timer();
        //在启动后3秒开始运行,并且后面每隔10秒运行一次
        timer.schedule(new TimeTest(),3000,10000);
    }

}
class TimeTest extends TimerTask{
    @Override
    public void run(){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("时间:"+simpleDateFormat.format(new Date()));
    }
}

其中有几种应用,

schedule(TimerTask task,long delay)延迟delay毫秒进行执行;

schedule(TimerTask task,Date time)特定时间执行;

schedule(TimerTask task,long delay,long period)延迟delay毫秒执行并每隔period毫秒执行一次;

里面的TimerTask类是一个抽象类,由Timer安排为一次执行或者是重复执行的任务,每一个具体的任务类都必须继承TimerTask,然后重写run()方法。如果TimerTask抛出为检查的异常,Timer将会产生无法预料的行为。还有就是Timer在时间管理上存在延迟的缺陷。

 

第二种方法:通常用ScheduledExecutorService来代替Timer

相比Timer的单线程,ScheduledExecutorService是通过线程池的方式来执行任务的。

提供了良好的约定,以便设置执行时间的间隔。

可以很灵活的去设置第一次执行任务delay时间。

public class TestController {
    public static void main(String[] args){
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                System.out.println("时间:"+simpleDateFormat.format(new Date()));
            }
        };
        ScheduledExecutorService s = Executors.newSingleThreadScheduledExecutor();
        //在5秒后执行并且每隔2秒执行一次
        s.scheduleAtFixedRate(runnable,5,2, TimeUnit.SECONDS);
    }
}

 

第三种方法:Quartz定时器实现

Quartz是一个由Java编写的开源作业调度框架。该框架允许开发人员根据时间间隔来调度作业。实现了作业和触发器的多对多的关系,还能把多个作业与不同的触发器关联,可以动态的添加删除定时任务,很好的支撑集群调度。

Quartz有三个核心的概念:调度器(Scheduler)、任务(Job&JobDetail)、触发器(Trigger)【一个任务可以被多个触发器触发,一个触发器只能触发一个任务】

JobDataMap可以装载任何可以序列化的数据,存取很方便,JobDetail和Trigger都可以关联JobDataMap。JobDataMap还可以在你们的实现类中,添加相应的setter方法获取。

添加maven依赖

        
            org.quartz-scheduler
            quartz
            2.2.3
        
        
            org.springframework
            spring-context-support
            4.2.5.RELEASE
        
@Component
public class TestTask {
    @Scheduled(cron="0/5 * *  * * ? ")
    public void test(){
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(dateFormat.format(new Date())+"每5秒");
    }
}

 

                     

你可能感兴趣的:(java基础)