ScheduledExecutorService 接口實現類
ScheduledExecutorService 是JAVA 1.5 后新增的定時任務接口,主要有以下幾個方法。
- ScheduledFuture《?》 schedule(Runnable command,long delay, TimeUnit unit);
- 《V》 ScheduledFuture《V》 schedule(Callable《V》 callable,long delay, TimeUnit unit);
- ScheduledFuture《?》 scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnitunit);
- ScheduledFuture《?》 scheduleWithFixedDelay(Runnable command,long initialDelay,long delay,TimeUnitunit);1234
默認實現為ScheduledThreadPoolExecutor 繼承了ThreadPoolExecutor 的線程池特性,配合future特性,比Timer更強大。 具體用法可以閱讀JDK文檔;spring Task內部也是依靠它實現的。示例代碼:
public static void main(String[] args) throws SchedulerException {
ScheduledThreadPoolExecutor executor = (ScheduledThreadPoolExecutor)Executors.newScheduledThreadPool(10);
for (int i = 0; i 《 10; ++i) {
executor.schedule(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + “ run ”);
}
} , 2 , TimeUnit.SECONDS);
}
executor.shutdown();
}
out:
pool-1-thread-2 run
pool-1-thread-5 run
pool-1-thread-4 run
pool-1-thread-3 run
pool-1-thread-8 run
pool-1-thread-5 run
pool-1-thread-7 run
pool-1-thread-2 run
pool-1-thread-1 run
pool-1-thread-6 run
Quartz 定時器實現
Quartz是一個完全由Java編寫的開源作業調度框架,為在Java應用程序中進行作業調度提供了簡單卻強大的機制。Quartz允許開發人員根據時間間隔來調度作業。它實現了作業和觸發器的多對多的關系,還能把多個作業與不同的觸發器關聯??梢詣討B的添加刪除定時任務,另外很好的支撐集群調度。簡單地創建一個org.quarz.Job接口的Java類,Job接口包含唯一的方法:
public void execute(JobExecutionContext context) throws JobExecutionException;
12
在Job接口實現類里面,添加需要的邏輯到execute()方法中。配置好Job實現類并設定好調度時間表(Trigger),Quartz就會自動在設定的時間調度作業執行execute()。
整合了Quartz的應用程序可以重用不同事件的作業,還可以為一個事件組合多個作業。Quartz通過屬性文件來配置JDBC事務的數據源、全局作業、觸發器偵聽器、插件、線程池等等。(quartz.properties)
通過maven引入依賴(這里主要介紹2.3.0) 注意:shiro-scheduler中依賴的是1.x版本 如果同時使用會沖突
《!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz --》
《dependency》
《groupId》org.quartz-scheduler《/groupId》
《artifactId》quartz《/artifactId》
《version》2.3.0《/version》
《/dependency》123456
創建Job類
public class TestJob implements Job{
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
println(Thread.currentThread().getName() + “ test job begin ” + DateUtil.getCurrentTimeStr());
}
}123456
調度任務
public static void main(String[] args) throws InterruptedException, SchedulerException {
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
// 開始
scheduler.start();
// job 唯一標識 test.test-1
JobKey jobKey = new JobKey(“test” , “test-1”);
JobDetail jobDetail = JobBuilder.newJob(TestJob.class).withIdentity(jobKey).build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(“test” , “test”)
// 延遲一秒執行
.startAt(new Date(System.currentTimeMillis() + 1000))
// 每隔一秒執行 并一直重復
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
.build();
scheduler.scheduleJob(jobDetail , trigger);
Thread.sleep(5000);
// 刪除job
scheduler.deleteJob(jobKey);
}
out :
DefaultQuartzScheduler_Worker-1test job begin 2017-06-03 14:30:33
DefaultQuartzScheduler_Worker-2test job begin 2017-06-03 14:30:34
DefaultQuartzScheduler_Worker-3test job begin 2017-06-03 14:30:35
DefaultQuartzScheduler_Worker-4test job begin 2017-06-03 14:30:36
DefaultQuartzScheduler_Worker-5test job begin 2017-06-03 14:30:37
配置參數的說明
在MONTH和Day Of Week字段里對字母大小寫不敏感
評論
查看更多