package com.iotek.classtype; public class Task1 { public static void main(String[] args) { final long timeInterval=1000; Runnable runnable =new Runnable() { @Override public void run() { while(true) { System.out.println("hello !!!"); try { Thread.sleep(timeInterval); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }; Thread thread=new Thread(runnable); thread.start(); } }
timer.schedule()方法
package com.iotek.classtype; import java.util.Timer; import java.util.TimerTask; public class Task2 { public static void main(String[] args) { TimerTask timerTask=new TimerTask() { @Override public void run() { System.out.println("HELLO"); } }; Timer timer=new Timer(); long delay=0; long intevalPeriod=1*1000; timer.schedule(timerTask, delay, intevalPeriod); } }
ScheduledExecutorService是從Java SE5的java.util.concurrent裏,作爲併發工具類被引進的,這是最理想的定時任務實現方式。java
相比於Timer的單線程,它是經過線程池的方式來執行任務的web
能夠很靈活的去設定第一次執行任務delay時間spring
提供了良好的約定,以便設定執行的時間間隔安全
package com.iotek.classtype; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class Task3 { public static void main(String[] args) { Runnable runnable=new Runnable() { @Override public void run() { System.out.println("hello"); } }; ScheduledExecutorService service=Executors.newSingleThreadScheduledExecutor(); service.scheduleAtFixedRate(runnable, 10,1,TimeUnit.SECONDS); } }
Timer類
這個類容許你調度一個java.util.TimerTask任務。主要有如下幾個方法:併發
//schedule(TimerTask task, long delay) 延遲 delay 毫秒 執行 public static void main(String[] args) { for(int i=0;i<10;i++) { new Timer().schedule(new TimerTask() { @Override public void run() { System.out.println(Thread.currentThread().getName()+" run"); } }, 1000); }
//schedule(TimerTask task, Date time) 特定時間執行 public static void main(String[] args) { for (int i = 0; i <20; i++) { new Timer("TIMER"+i).schedule(new TimerTask() { @Override public void run() { System.out.println(Thread.currentThread().getName()+" RUN"); } }, new Date(System.currentTimeMillis()+2000)); } }
//schedule(TimerTask task, long delay, long period) 延遲 delay 執行並每隔period 執行一次 public static void main(String[] args) { for (int i = 0; i < 10; i++) { new Timer(" timer"+i).scheduleAtFixedRate(new TimerTask() { @Override public void run() { System.out.println(Thread.currentThread().getName()+"run"); } }, 1000, 2000); } }
ScheduledExecutorService 接口實現類
ScheduledExecutorService 是JAVA 1.5 後新增的定時任務接口,主要有如下幾個方法。框架
ScheduledFuture<?> schedule(Runnable command,long delay, TimeUnit unit); 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);
默認實現爲ScheduledThreadPoolExecutor 繼承了ThreadPoolExecutor 的線程池特性,配合future特性,比Timer更強大。 具體用法能夠閱讀JDK文檔;spring Task內部也是依靠它實現的
。示例代碼:maven
public static void main(String[] args) { ScheduledExecutorService service=Executors.newSingleThreadScheduledExecutor(); for (int i = 0; i < 10; i++) { service.schedule(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + " run "); } }, 2, TimeUnit.SECONDS); } service.shutdown(); }
Quartz是一個徹底由Java編寫的開源做業調度框架,爲在Java應用程序中進行做業調度提供了簡單卻強大的機制。Quartz容許開發人員根據時間間隔來調度做業。它實現了做業和觸發器的多對多的關係,還能把多個做業與不一樣的觸發器關聯。能夠動態的添加刪除定時任務,另外很好的支撐集羣調度。簡單地建立一個org.quarz.Job接口的Java類,Job接口包含惟一的方法:ide
public void execute(JobExecutionContext context) throws JobExecutionException;
在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>
建立Job類
public class TestJob implements Job{ @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { println(Thread.currentThread().getName() + " test job begin " + DateUtil.getCurrentTimeStr()); } }
調度任務
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); }
關於簡單使用,能夠參考quartz的example,下面連接是一些入門幫助。
Quartz定時任務學習(一)簡單任務
Quartz定時任務學習(二)web應用
Quartz定時任務學習(三)屬性文件和jar
深刻學習能夠閱讀官方文檔和相關博客閱讀
如下爲推薦博客地址
quartz詳解2:quartz由淺入深
Spring 3.0+ 自帶的任務調度實現,主要依靠TaskScheduler
接口的幾個實現類實現。刪除和修改任務比較麻煩。
主要用法有如下三種:
spring-schedule.xml <task:scheduler id="myScheduler" pool-size="10" /> <task:scheduled-tasks scheduler="myScheduler"> <task:scheduled ref="job" method="test" cron="0 * * * * ?"/> </task:scheduled-tasks>
註解實現
spring-schedule.xml <task:scheduler id="myScheduler" pool-size="10" /> // 啓用註解 <task:annotation-driven scheduler="myScheduler"/>
@Component public class Task{ @Scheduled(cron="0/5 * * * * ? ") //每5秒執行一次 public void execute(){ DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sdf.format(DateTime.now().toDate())+"*********B任務每5秒執行一次進入測試"); } }
代碼動態添加
spring-schedule.xml <bean id = "myScheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler"> <property name="poolSize" value="10"/> <property name="threadGroupName" value="myScheduler" /> <property name="threadNamePrefix" value="-1" /> </bean> <task:annotation-driven scheduler="myScheduler"/>
@Component public class Test { @Autowired private ThreadPoolTaskScheduler myScheduler; public void addJob(){ myScheduler.schedule(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + " run "); } } , new CronTrigger("0/5 * * * * ? ")); //每5秒執行一次 } }
<bean id="quartzsScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false"> <property name="triggers"> <list> <ref bean="testTrigger" /> </list> </property> </bean> <!-- jobClass須要繼承QuartzJobBean 也可使用 MethodInvokingJobDetailFactoryBean 定義任意類任意方法爲Job--> <bean id="testJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="jobClass"> <value>com.test.TestJob</value> </property> <property name="durability" value="true" /> <!-- requestsRecovery屬性必須設置爲 true,當Quartz服務被停止後,再次啓動或集羣中其餘機器接手任務時會嘗試恢復執行以前未完成的全部任務 --> <property name="requestsRecovery" value="true" /> </bean> <bean id="testTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="testJobDetail" /> <property name="cronExpression" value="0 0 10 * * ?" /> </bean>
動態增長刪除
@Component public class Test { @Autowired private SchedulerFactoryBean quartzScheduler; public void addJob() throws SchedulerException { Scheduler scheduler = quartzScheduler.getScheduler(); JobKey jobKey = new JobKey("test", "test"); if (scheduler.checkExists(jobKey)) { return; } JobDetail jobDetail = JobBuilder.newJob(TestJob.class).withIdentity(jobKey).build(); Trigger trigger = TriggerBuilder.newTrigger().withIdentity("test", "test") .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever()).build(); scheduler.scheduleJob(jobDetail, trigger); } }