java的几种定时任务

2024-11-20 07:53:37
推荐回答(1个)
回答1:

java定时任务有三种:

- JDK自带 :JDK自带的Timer以及JDK1.5+ 新增的ScheduledExecutorService; 


- Quartz    :简单却强大的JAVA作业调度框架 


- Spring3.0以后自带的task :可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多;

代码参考:

  1. JDK 自带的定时器实现

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


    public static void main(String[] args) {


    for (int i = 0; i < 10; ++i) {


    new Timer("timer - " + i).schedule(new TimerTask() {


    @Override
    public void run() {


    println(Thread.currentThread().getName() + " run ");


    }


    }, new Date(System.currentTimeMillis() + 2000));


    }
    }

  2. Quartz 定时器实现

    2.1  通过maven引入依赖(这里主要介绍2.3.0)  注意:shiro-scheduler中依赖的是1.x版本  如果同时使用会冲突



    org.quartz-scheduler


    quartz


    2.3.0


    2.2 创建Job类

    public class TestJob implements Job{


    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {


    println(Thread.currentThread().getName() + " test job begin " + DateUtil.getCurrentTimeStr());


    }
    }

    2.3 调度任务

    public static void main(String[] args) throws InterruptedException, SchedulerException {


    Scheduler scheduler = new StdSchedulerFactory().getScheduler();


    // 开始


    scheduler.start();


    // job 唯一标识 test.test-1


    JobKey jobKey = new JobKey("test" , "test-1");


    JobDetail jobDetail = JobBuilder.newJob(TestJob.class).withIdentity(jobKey).build();


    Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("test" , "test")

// 延迟一秒执行

.startAt(new Date(System.currentTimeMillis() + 1000))

// 每隔一秒执行 并一直重复

.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
.build();

scheduler.scheduleJob(jobDetail , trigger);

Thread.sleep(5000);
// 删除job

scheduler.deleteJob(jobKey);


}

3.Spring 相关的任务调度

3.1 配置文件实现

spring-schedule.xml




3.2注解实现

spring-schedule.xml



// 启用注解


@Component 
public class Task{       

@Scheduled(cron="0/5 * *  * * ? ")   //每5秒执行一次
public void execute(){     


DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    


System.out.println(sdf.format(DateTime.now().toDate())+"*********B任务每5秒执行一次进入测试");      


}     
}