简单的时间间隔调度任务

ScheduledExecutor
Java 5 推出了基于线程池设计的 ScheduledExecutor。其设计思想是,每一个被调度的任务都会由线程池中一个线程去执行,因此任务是并发执行的,相互之间不会受到干扰。需要注意的是,只有当任务的执行时间到来时,ScheduedExecutor 才会真正启动一个线程,其余时间 ScheduledExecutor 都是在轮询任务的状态。
 
package com.ibm.scheduler;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
 
public class ScheduledExecutorTest implements Runnable {
     private String jobName = "";
     public ScheduledExecutorTest(String jobName) {
         super();
         this.jobName = jobName;
     }
 
     @Override
     public void run() {
         System.out.println("execute " + jobName);
     }
 
     public static void main(String[] args) {
         ScheduledExecutorService service = Executors.newScheduledThreadPool(10);
 
         long initialDelay1 = 1;
         long period1 = 1;
         // 从现在开始1秒钟之后,每隔1秒钟执行一次job1
         service.scheduleAtFixedRate(
                 new ScheduledExecutorTest("job1"), initialDelay1,
                 period1, TimeUnit.SECONDS);
 
         long initialDelay2 = 4;
         long delay2 = 2;
         // 从现在开始4秒钟之后,每隔2秒钟执行一次job2
         service.scheduleWithFixedDelay(
                 new ScheduledExecutorTest("job2"), initialDelay2,
                 delay2, TimeUnit.SECONDS);
     }
}
Output:
execute job1
execute job1
execute job1
execute job1
execute job2
execute job1
execute job1
execute job2
 
 

Quartz

Quartz 可以满足更多更复杂的调度需求,首先让我们看看如何用 Quartz 实现每星期二 16:38 的调度安排:

 

package com.ibm.scheduler;
import java.util.Date;
 
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.helpers.TriggerUtils;
 
public class QuartzTest implements Job {
 
     @Override
     //该方法实现需要执行的任务
     public void execute(JobExecutionContext arg0) throws JobExecutionException {
         System.out.println("Generating report - "
                 + arg0.getJobDetail().getFullName() + ", type ="
                 + arg0.getJobDetail().getJobDataMap().get("type"));
         System.out.println(new Date().toString());
     }
     public static void main(String[] args) {
         try {
             // 创建一个Scheduler
             SchedulerFactory schedFact =
             new org.quartz.impl.StdSchedulerFactory();
             Scheduler sched = schedFact.getScheduler();
             sched.start();
             // 创建一个JobDetail,指明name,groupname,以及具体的Job类名,
             //该Job负责定义需要执行任务
             JobDetail jobDetail = new JobDetail("myJob", "myJobGroup",
                     QuartzTest.class);
             jobDetail.getJobDataMap().put("type", "FULL");
             // 创建一个每周触发的Trigger,指明星期几几点几分执行
             Trigger trigger = TriggerUtils.makeWeeklyTrigger(3, 16, 38);
             trigger.setGroup("myTriggerGroup");
             // 从当前时间的下一秒开始执行
             trigger.setStartTime(TriggerUtils.getEvenSecondDate(new Date()));
             // 指明trigger的name
             trigger.setName("myTrigger");
             // 用scheduler将JobDetail与Trigger关联在一起,开始调度任务
             sched.scheduleJob(jobDetail, trigger);
 
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
}
Output:
Generating report - myJobGroup.myJob, type =FULL
Tue Feb 8 16:38:00 CST 2011
Generating report - myJobGroup.myJob, type =FULL
Tue Feb 15 16:38:00 CST 2011
 

转载于:https://www.cnblogs.com/luozhenfei/p/10470720.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值