1-使用 TimerTask 创建job定时任务
public class JobTimerTask {
static long count = 0;
public static void main(String[] args) {
TimerTask timerTask = new TimerTask(){
@Override
public void run() {
count++;
System.out.println("==:"+count);
}
};
Timer timer = new Timer();
long delay = 0;
long period = 1000;
timer.scheduleAtFixedRate(timerTask,delay,period);
}
}
输出结果:
2-使用线程创建 job 定时任务
public class JobThread {
static long count = 0;
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
count++;
System.out.println("----:" + count);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
Thread thread = new Thread(runnable);
thread.start();
}
}
结果是:
3-使用线程创建 job 定时任务
public class JobScheduledExecutorService {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("hello!");
}
};
ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
scheduledExecutorService.scheduleAtFixedRate(runnable,1,1, TimeUnit.SECONDS);//每隔一秒执行一次
}
}
结果:
4-Quartz框架
引入依赖:
<!-- quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
实现类:
public class MyJob implements Job {
public void execute(JobExecutionContext context){
System.out.println("quartz Myjob date:"+System.currentTimeMillis());
}
}
启动类:
public class JobQuartz {
public static void main(String[] args) throws SchedulerException {
//1-创建sheduler的工厂
StdSchedulerFactory sf = new StdSchedulerFactory();
//2-从工厂中获取调度器实例
Scheduler scheduler = sf.getScheduler();
//3-创建JobDetail
JobDetail jb = JobBuilder.newJob(MyJob.class)
//job的描述
.withDescription("this is a ram job")
//job的name和group
.withIdentity("ramJob", "ramGroup")
.build();
//任务运行的时间 simpleSchedule类型次触发器有效 3秒后启动任务
long time = System.currentTimeMillis()+3*1000L;
Date statTime = new Date(time);
//创建Trigger
//使用SimpleScheduleBuilder 或者 CronScheduleBuilder
CronTrigger t = TriggerBuilder.newTrigger()
.withDescription("")
.withIdentity("ramTrigger", "ramTriggerGroup")
//默认当前启动时间
.startAt(statTime)
//两秒执行一次 Quartz表达式
.withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?"))
.build();
//注册定时任务和定时器
scheduler.scheduleJob(jb,t);
scheduler.start();
}
}
5-springboot 的 @Scheduled 注解
启动类配置
@SpringBootApplication
@EnableScheduling //在启动类中加入启动定时任务的注解
public class NiuaApplication {
public static void main(String[] args) {
SpringApplication.run(NiuaApplication.class, args);
}
}
定时任务业务:注解@Configuration和@Scheduled注解
@Configuration
public class SaticScheduleTask {
//@Scheduled(fixedRate = 1000)
@Scheduled(cron = "0/5 * * * * ?")
private void configurationTask(){
System.out.println("执行定时任务的时间:"+ LocalDateTime.now());
}
}
秒 分 时 日 月 年
“30 * * * * ?” 每半分钟触发任务
“30 10 * * * ?” 每小时的10分30秒触发任务
“30 10 1 * * ?” 每天1点10分30秒触发任务
“30 10 1 20 * ?” 每月20号1点10分30秒触发任务
“30 10 1 20 10 ? *” 每年10月20号1点10分30秒触发任务
“30 10 1 20 10 ? 2011” 2011年10月20号1点10分30秒触发任务
“30 10 1 ? 10 * 2011” 2011年10月每天1点10分30秒触发任务
“30 10 1 ? 10 SUN 2011” 2011年10月每周日1点10分30秒触发任务
“15,30,45 * * * * ?” 每15秒,30秒,45秒时触发任务
“15-45 * * * * ?” 15到45秒内,每秒都触发任务
“15/5 * * * * ?” 每分钟的每15秒开始触发,每隔5秒触发一次
“15-30/5 * * * * ?” 每分钟的15秒到30秒之间开始触发,每隔5秒触发一次
“0 0/3 * * * ?” 每小时的第0分0秒开始,每三分钟触发一次
“0 15 10 ? * MON-FRI” 星期一到星期五的10点15分0秒触发任务
“0 15 10 L * ?” 每个月最后一天的10点15分0秒触发任务
“0 15 10 LW * ?” 每个月最后一个工作日的10点15分0秒触发任务
“0 15 10 ? * 5L” 每个月最后一个星期四的10点15分0秒触发任务
“0 15 10 ? * 5#3” 每个月第三周的星期四的10点15分0秒触发任务