创建定时任务的几种姿势

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秒触发任务

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值