黑马程序员技术交流社区

标题: 【上海校区】多线程_任务定时调度(Timer、Timetask和QUARTZ) [打印本页]

作者: Wjie    时间: 2019-11-14 10:36
标题: 【上海校区】多线程_任务定时调度(Timer、Timetask和QUARTZ)
一、Timer和Timetask

通过Timer和Timetask,我们可以实现定时启动某个线程。

java.util.Timer

      在这种实现方式中,Timer类作用是类似闹钟的功能,也就是定时或者每隔一定时间触发一次线程。其实,Timer类本身实现的就是一个线程,

只是这个线程是用来实现调用其它线程的。

java.util.TimerTask

      TimerTask类是一个抽象类,该类实现了Runnable接口,所以该类具备多线程的能力。

在这种实现方式中,通过继承TimerTask使该类获得多线程的能力,将需要多线程执行的代码书写在run方法内部,然后通过Timer类启动线程的执行。

【代码】

/***任务定时调度:Timer类 (相当于闹钟) TimerTask类 (抽象类)
  */
package cn.itcast.demo.com;

        import java.util.Calendar;
        import java.util.Date;
        import java.util.GregorianCalendar;
        import java.util.Timer;
        import java.util.TimerTask;

public class test02 {
    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----");
    }
}
原址:  https://www.cnblogs.com/ID-qingxin/p/10680762.html




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2