定时任务Elastic-job入门学习01
1、概述:
1.1、任务调度;
- 系统为了自动完成特定任务,在约定的特定时刻去执行任务
- 节省人力
- 下面业务场景的解决方案∶
- 某电商系统需要在每天上午10点,下午3点,晚上8点发放一批优惠券。·某银行系统需要在信用卡到期还款日的前三天进行短信提醒。
- 某财务系统需要在每天凌晨0:10结算前一天的财务数据,统计汇总。 12306会根据车次的不同,而设置某几个时间点进行分批放票。
- 某网站为了实现天气实时展示,每隔5分钟就去天气服务器获取最新的实时天气信息。
1.2、基本实现:
1. 多线程:
//任务执行间隔时间
final long timeInterval = 1000;
Runnable runnable = () -> {
while (true){
System.out.println(LocalDateTime.now()+"这是多线程实现任务调度,我将每隔1s执行一次");
try {
Thread.sleep(timeInterval);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Thread thread = new Thread(runnable);
thread.start();
2. 时间timer(jdk):
//一个timer就是一个线程
Timer timer1 = new Timer();
Timer timer2 = new Timer();
timer1.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(LocalDateTime.now()+"timer1方式实现任务调度!");
}
},1000,2000);//1秒后开始任务调度,每2秒执行一次
timer2.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(LocalDateTime.now()+"timer2方式实现任务调度!");
}
},1000,3000);//1秒后开始任务调度,每3秒执行一次
3. 任务调度线程池
- ScheduledExecutorService为任务调度线程池,可以支持多个线程并行执行任务调度。参数为线程数,
- 线程数为1效果和timer一样。
- scheduleAtFixedRate():延迟一定时间后执行任务
- 按指定频率周期执行某个任务
- 初始化延迟0ms开始执行,每隔100ms重新执行一次任务。
- Runnable command:执行线程
- long initialDelay:初始化延时
- long period:前一次执行结束到下一次执行开始的间隔时间(间隔执行延迟时间)
- TimeUnit unit:时间单位
- 以上一个任务开始的时间计时,period秒过去后,检测上一个任务是否执行完毕,如果上一个任务执行完毕,则当前任务立即执行,如果上一个任务没有执行完毕,则需要等上一个任务执行完毕后立即执行
- scheduleWithFixedDelay(),是以上一个任务结束时开始计时,period秒过去后,立即执行。==指定频率间隔执行某个任务。==初始化时延时0ms开始执行,本次执行结束后延迟100ms开始下次执行
ScheduledExecutorService pool = Executors.newScheduledThreadPool(10);
System.err.println("start...");
pool.scheduleAtFixedRate(()->{
System.err.println("running...");
},1,1,TimeUnit.SECONDS);
Thread.sleep(10000);
pool.shutdown();
System.err.println("shutdown");