Java------多线程_高级主题_定时调度_quartz(十三)

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---------------------------");
    }
}

猜你喜欢

转载自blog.csdn.net/cz_chen_zhuo/article/details/121748006