[19/04/12-星期五] 多线程_任务定时调度(Timer、Timetask和QUARTZ)
一、Timer和Timetask
通过Timer和Timetask,我们可以实现定时启动某个线程。
java.util.Timer
在这种实现方式中,Timer类作用是类似闹钟的功能,也就是定时或者每隔一定时间触发一次线程。其实,Timer类本身实现的就是一个线程,
只是这个线程是用来实现调用其它线程的。
java.util.TimerTask
TimerTask类是一个抽象类,该类实现了Runnable接口,所以该类具备多线程的能力。
在这种实现方式中,通过继承TimerTask使该类获得多线程的能力,将需要多线程执行的代码书写在run方法内部,然后通过Timer类启动线程的执行。
【代码】
/***任务定时调度:Timer类 (相当于闹钟) TimerTask类 (抽象类) * */ package cn.sxt.thread; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.Timer; import java.util.TimerTask; public class Test_0412_TimeDispatch { public static void main(String[] args) { Timer timer=new Timer();//闹钟 //timer.schedule(new MyTask(), 3000);//执行安排。3秒后执行MyTask()类中run方法,仅执行1次 //timer.schedule(new MyTask(), 2000,1000);//中间参数:第一次执行的时间,2秒后,每隔1秒执行一次run方法,执行多次 //timer.schedule(new MyTask(), new Date(3000),1000);//5秒后,每隔1秒执行一次run方法,执行多次 Calendar calendar=new GregorianCalendar(2019,03,10,00,14,50);//指定2019年04年10日00点14分50秒这个时间来运行程序 timer.schedule(new MyTask(), calendar.getTime(),1000); } } //任务类 class MyTask extends TimerTask{ public void run() { for (int i = 0; i < 5; i++) { System.out.println(i+"->休息一下"); } System.out.println("end"); } }
二、QUARTZ(石英表)
package cn.sxt.thread; import static org.quartz.DateBuilder.evenSecondDateAfterNow; import static org.quartz.JobBuilder.newJob; import static org.quartz.TriggerBuilder.newTrigger; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.Trigger; import org.quartz.impl.StdSchedulerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Date; public class SimpleExample { public void run() throws Exception { //1、 创建Scheduler的工厂 SchedulerFactory sf = new StdSchedulerFactory(); //2、从工厂获得调度器 Scheduler sched = sf.getScheduler(); //3、创建JobDetail JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build(); //4、触发器 Date runTime=evenSecondDateAfterNow(); Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build(); // 5、注册任务和触发条件 sched.scheduleJob(job, trigger); //6、启动 sched.start(); try { // 5秒后停下 Thread.sleep(5L * 1000L); } catch (Exception e) { } sched.shutdown(true); } public static void main(String[] args) throws Exception { SimpleExample example = new SimpleExample(); example.run(); } }
package cn.sxt.thread; import java.util.Date; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class HelloJob implements Job { public HelloJob() { } public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("---start----"); System.out.println("Hello World"+new Date()); System.out.println("---end----"); } }