Java------多线程_高级主题_定时调度_quartez(十三)
定时调度
通过Timer和Timetask,可以实现定时启动某个线程。
java.util.Timer:类似闹钟的功能,本身实现的就是一个线程。
java.util.TimerTask:一个抽象类,该类实现了Runnable接口,所以该类具备多线程的能力。
Timer:线程调度任务,以供将来在后台线程中执行的功能。任务可以安排一次执行,也可以定期多次执行。
TimerTask:可以由Timer进行一次性或重复执行的任务。抽象类,重写run方法。
定时调度示例代码:
package cooperation;
import java.util.*;
public class ThreadTimer {
public static void main(String[] args) {
Timer timer = new Timer();
//执行安排
// timer.schedule(new MyTask(),1000); //1秒后执行一次
// timer.schedule(new MyTask(),1000,1000); //1秒后执行,每1秒执行一次
Calendar calendar = new GregorianCalendar(2021,12,06,15,43,01);
timer.schedule(new MyTask(),calendar.getTime(),1000); //指定时间后运行
}
}
class MyTask extends TimerTask {
@Override
public void run() {
for (int i = 0 ;i<10;i++){
System.out.println("休息时间---"+i);
}
System.out.println("end-------------------");
}
}
quartz
复杂的任务调度则使用quartz。
Scheduler:调度器,控制所有的调度
Tigger:触发条件,采用DSL模式
JobDetail:需要处理的Job
Job:执行逻辑
DSL:Domain-specific language领域特定语言,针对一个特定的领域,具有受限表达性的一种计算机程序语言,即领域专用语言,声明式编程:
1.Method Chaining 方法链,Fluent Style流畅风格,builder模式构建器
2.Nested Functions 嵌套函数
3.Lamdba Expressions/Closures
4.Functional Sequence
quartz案例代码
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.util.Date;
import static org.quartz.DateBuilder.evenMinuteDateAfterNow;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
/**
* quartz学习入门
*/
public class SimpleExample {
public void run() throws Exception{
//1.创建Scheduler的工厂
SchedulerFactory sf = new StdSchedulerFactory();
//2.从工厂中获得调度器
Scheduler scheduler = sf.getScheduler();
//3.创建JobDetail
JobDetail job = newJob(HelloJob.class).withIdentity("job1","group1").build();
//时间
Date runTime = evenMinuteDateAfterNow();
//4.触发器
Trigger trigger = newTrigger().withIdentity("job1", "group1").startAt(runTime).build();
//多次执行 间隔10秒,重复10次
SimpleTrigger trigger1 = newTrigger().withIdentity("job1", "group1").startAt(runTime).withSchedule(simpleSchedule()
.withIntervalInSeconds(10).withRepeatCount(10)).build();
//5.注册任务和触发条件
scheduler.scheduleJob(job,trigger);
//6.启动
scheduler.start();
//5秒后停止
Thread.sleep(5L*1000L);
scheduler.shutdown(true);
}
public static void main(String[] args) throws Exception {
SimpleExample simpleExample = new SimpleExample();
simpleExample.run();
}
}
其中helloJob是自定义的任务
public class HelloJob implements Job {
@Override
public void interrupt() throws UnableToInterruptJobException {
}
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("start---------------------------");
System.out.println("hello world"+new Date());
System.out.println("end---------------------------");
}
}