<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
這種方式的定時任務主要用到兩個類,Timer 和 TimerTask,使用起來比較簡單。其中 Timer 負責設定 TimerTask 的起始與間隔執行時間。 TimerTask是一個抽象類,new的時候實現自己的 run 方法,然後將其丟給 Timer 去執行即可。
程式碼範例:
import java.time.LocalDateTime; import java.util.Timer; import java.util.TimerTask; public class Schedule { public static void main(String[] args) { TimerTask timerTask = new TimerTask() { @Override public void run() { System.out.println("當前執行緒:" + Thread.currentThread().getName() + " 當前時間" + LocalDateTime.now()); } }; // 在指定延遲0毫秒後開始,隨後地執行以2000毫秒間隔執行timerTask new Timer().schedule(timerTask, 0L, 2000L); System.out.println("當前執行緒:" + Thread.currentThread().getName() + " 當前時間" + LocalDateTime.now()); } }
缺點:
ScheduledExecutorService 即是 Timer 的替代者,JDK 1.5 並行包引入,是基於執行緒池設計的定時任務類。每個排程任務都會分配到執行緒池中的某一個執行緒去執行,任務就是並行排程執行的,任務之間互不影響。
Java 5.0引入了java.util.concurrent包,其中的並行實用程式之一是ScheduledThreadPoolExecutor ,它是一個執行緒池,用於以給定的速率或延遲重複執行任務。它實際上是Timer/TimerTask組合的更通用替代品,因為它允許多個服務執行緒,接受各種時間單位,並且不需要子類TimerTask (只需實現Runnable)。使用一個執行緒設定ScheduledThreadPoolExecutor使其等效於Timer 。
程式碼範例:
import java.time.LocalDateTime; import java.util.concurrent.*; public class Schedule { public static void main(String[] args) { // 建立一個ScheduledThreadPoolExecutor執行緒池,核心執行緒數為5 ScheduledExecutorService scheduledExecutorService = new ScheduledThreadPoolExecutor(5); // 建立Runnable列印當前執行緒和當前時間 Runnable r = () -> System.out.println("當前執行緒:" + Thread.currentThread().getName() + " 當前時間" + LocalDateTime.now()); /** * schedule:只執行一次排程 * scheduleAtFixedRate:一開始就計算間隔時間,如果任務超過間隔時間,那麼就直接開始下一個任務 * scheduleWithFixedDelay:任務無論執行多久,都要等待上一輪任務完成之後再間隔指定時間,然後才開始下一個任務 */ // 在指定1秒延遲後執行r,之後每兩秒執行一次 scheduledExecutorService.scheduleAtFixedRate(r, 1, 2, TimeUnit.SECONDS); } }
Spring Task 底層是基於 JDK 的 ScheduledThreadPoolExecutor 執行緒池來實現的。直接通過Spring 提供的 @Scheduled 註解即可定義定時任務,非常方便。
以Spring Boot來作為範例,步驟為
String cron() default ""; // 支援cron表示式 long fixedDelay() default -1; // 在最後一次呼叫結束和下一次呼叫開始之間的時間間隔,以毫秒為單位 String fixedDelayString() default ""; // 同上,類似ScheduledExecutorService的scheduleWithFixedDelay long fixedRate() default -1; // 在呼叫之前的時間間隔,以毫秒為單位 String fixedRateString() default ""; // 同上,類似ScheduledExecutorService的scheduleAtFixedRate long initialDelay() default -1; // 在第一次執行fixedRate()或fixedDelay()任務之前要延遲的毫秒數 String initialDelayString() default ""; // 同上
程式碼範例:
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @Component @EnableScheduling public class Schedule { @Scheduled(fixedRate = 2000L) public void task() { System.out.println("當前執行緒:" + Thread.currentThread().getName() + " 當前時間" + LocalDateTime.now()); } }
優點: 簡單,輕量,支援 Cron 表示式缺點 :預設只支援單機,是單執行緒的,並且提供的功能比較單一
可以通過@EnableAsync和 @Async開啟多執行緒
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @Component @EnableAsync // 開啟非同步多執行緒 @EnableScheduling public class Schedule { @Async @Scheduled(fixedRate = 2000L) public void task() { System.out.println("當前執行緒:" + Thread.currentThread().getName() + " 當前時間" + LocalDateTime.now()); } }
使用@EnableAsync註解後,預設情況下,Spring將搜尋關聯的執行緒池定義:上下文中的唯一org.springframework.core.task.TaskExecutor
的bean,或者名為“taskExecutor”的java.util.concurrent.Executor
的bean。如果兩者都無法解析,則將使用org.springframework.core.task.SimpleAsyncTaskExecutor來處理非同步方法呼叫。
TaskExecutor實現為每個任務啟動一個新執行緒,非同步執行它。 支援通過“concurrencyLimit”bean 屬性限制並行執行緒。預設情況下,並行執行緒數是無限的,所以使用預設的執行緒池有導致記憶體溢位的風險。
注意:剛才的執行結果看起來是執行緒複用的,而實際上此實現不重用執行緒!應儘量實現一個執行緒池TaskExecutor ,特別是用於執行大量短期任務。不要使用預設的SimpleAsyncTaskExecutor。
import org.springframework.context.annotation.Bean; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.util.concurrent.Executor; @Component @EnableAsync @EnableScheduling public class Schedule { @Async @Scheduled(fixedRate = 2000L) public void task() { System.out.println("當前執行緒:" + Thread.currentThread().getName() + " 當前時間" + LocalDateTime.now()); } @Bean("taskExecutor") public Executor taskExecutor() { ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); taskExecutor.setCorePoolSize(10); taskExecutor.setMaxPoolSize(50); taskExecutor.setQueueCapacity(200); taskExecutor.setKeepAliveSeconds(60); taskExecutor.setThreadNamePrefix("自定義-"); taskExecutor.setAwaitTerminationSeconds(60); return taskExecutor; } }
上面提到的一些定時任務的解決方案都是在單機下執行的,適用於比較簡單的定時任務場景比如每天凌晨備份一次資料。如果我們需要一些高階特性比如支援任務在分散式場景下的分片和高可用的話,我們就需要用到分散式任務排程框架了,比如Quartz、Elastic-Job、XXL-JOB、PowerJob,本文就不再詳細進行介紹了,感興趣的可以自行查閱相關資料。
到此這篇關於Java專案實現定時任務的三種方法的文章就介紹到這了,更多相關Java定時任務實現內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45