Java實(shí)現(xiàn)定時(shí)器的4種方法超全總結(jié)
前言
Java實(shí)現(xiàn)定時(shí)器的方法有很多,本章主要淺談一下知道的幾種方法:
方法1:使用Timer和和TimerTask類
1、Timer和TimerTask是java.util包下的類,用于實(shí)現(xiàn)定時(shí)任務(wù)
步驟1:創(chuàng)建TimerTask定時(shí)器任務(wù),可以通過匿名內(nèi)部類的方式創(chuàng)建
步驟2:創(chuàng)建Timer定時(shí)器,調(diào)用定時(shí)器的方法執(zhí)行定時(shí)器任務(wù)
2、Timer的兩個(gè)方法schedule()和scheduleAtFixedRate()及其重載方法:
void schedule(TimerTask task, long delay):在指定時(shí)間后執(zhí)行1次任務(wù),其中delay表示時(shí)延,單位是毫秒,設(shè)置為1000,則表示1秒后執(zhí)行一次定時(shí)器任務(wù);
void schedule(TimerTask task, long delay, long period):指定延遲指定時(shí)間后周期性地執(zhí)行任務(wù)(delay毫秒后,每period毫秒執(zhí)行一次)
void scheduleAtFixedRate(TimerTask task, long delay, long period):指定延遲指定時(shí)間后周期性地執(zhí)行任務(wù)(delay毫秒后,每period毫秒執(zhí)行一次)
void scheduleAtFixedRate(TimerTask task, Date firstTime,long period) :從指定日期firstTime開始,每period毫秒執(zhí)行一次任務(wù)
3、案例代碼
public class TimerExample { public static void main(String[] args) { // 創(chuàng)建定時(shí)器 Timer timer = new Timer(); // 創(chuàng)建定時(shí)器任務(wù) TimerTask timerTask = new TimerTask() { @Override public void run() { System.out.println("Hello world!"); } }; timer.schedule(timerTask, 1000); // 1秒后執(zhí)行一次 timer.schedule(timerTask, 2000, 2000); // 兩秒后每兩秒執(zhí)行一次 timer.scheduleAtFixedRate(timerTask, 3000, 3000); // 3秒后每3秒執(zhí)行一次 timer.scheduleAtFixedRate(task, new Date(), 4000); // 每4秒執(zhí)行一次 } }
方法2:使用線程池
其中線程池的方法使用和Timer一樣,TimeUnit是一個(gè)枚舉類型,用于指定時(shí)間單位,有NANOSECONDS(納秒)、MICROSECONDS(微秒)、MILISECONDS(毫秒)、SECONDS(秒)、MINUTE(分鐘)、HOURS(小時(shí))和DAYS(天)。
案例代碼:
public class TimerExample { public static void main(String[] args) { // 創(chuàng)建定時(shí)器任務(wù) TimerTask timerTask = new TimerTask() { @Override public void run() { System.out.println("Hello world!"); } }; ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2); scheduledThreadPool.schedule(timerTask, 1000, TimeUnit.MILLISECONDS); scheduledThreadPool.scheduleAtFixedRate(timerTask, 1000, 1000, TimeUnit.MILLISECONDS); } }
方法3:使用Spring Task
步驟1:在springBoot啟動(dòng)類上添加@EnableScheduling注解
@EnableScheduling @SpringBootApplication public class SpringbootApplication { public static void main(String[] args) { SpringApplication.run(SpringbootApplication.class, args); } }
步驟2:創(chuàng)建一個(gè)定時(shí)任務(wù)類的bean,在類的方法上使用@Schedule注解,通過注解的cron屬性設(shè)置定時(shí)器的屬性
@Component public class TimerTask { @Scheduled(cron = "0 7 2 26 7 *") public void task() { System.out.println("定時(shí)任務(wù)..."); } }
以上代碼指定在2022年7月26日02:07:00執(zhí)行一次定時(shí)任務(wù),對cron表達(dá)式感興趣的可以去學(xué)習(xí)了解一下,這里就不介紹了。
方法4:通過Quartz任務(wù)調(diào)度工具
步驟1:在pom.xml中添加quartz的依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>
步驟2:創(chuàng)建quartz的配置類
@Configuration public class QuartzConfig { // 創(chuàng)建一個(gè)JobDetail(工作詳情)類對象,保存到Spring容器中,這個(gè)類用于封裝我們編寫的job接口實(shí)現(xiàn)類 @Bean public JobDetail jobDetail(){ System.out.println("showTime方法運(yùn)行"); return JobBuilder.newJob(QuartzJob.class) // 綁定要運(yùn)行的任務(wù)類的類對象 .withIdentity("job") // 設(shè)置job的名稱 .storeDurably() // 信息持久 // 設(shè)置storeDurably之后,當(dāng)沒有觸發(fā)器指向這個(gè)JobDetail時(shí),JobDetail也不會(huì)從 // Spring容器中刪除,如果不設(shè)置這行,就會(huì)自動(dòng)從Spring容器中刪除 .build(); } // 聲明觸發(fā)器,觸發(fā)器決定我們的工作\任務(wù)何時(shí)觸發(fā) @Bean public Trigger trigger(){ System.out.println("showTime觸發(fā)器運(yùn)行"); // 定義Cron表達(dá)式,每分鐘觸發(fā)一次 CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/10 * * * * ?"); return TriggerBuilder.newTrigger() .forJob(jobDetail()) // 綁定JobDetail對象 .withIdentity("trigger") // 定義觸發(fā)器名稱 .withSchedule(cronScheduleBuilder) // 綁定Cron表達(dá)式 .build(); } }
步驟:3:定義Job
public class QuartzJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) { // 輸出當(dāng)前時(shí)間 System.out.println(LocalDateTime.now()); } }
總結(jié)
到此這篇關(guān)于Java實(shí)現(xiàn)定時(shí)器的4種方法的文章就介紹到這了,更多相關(guān)Java實(shí)現(xiàn)定時(shí)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)文字滾動(dòng)廣告字幕效果
文字滾動(dòng)廣告字幕是一種常見的動(dòng)態(tài)文本展示效果,通常用于展示新聞、廣告或其他動(dòng)態(tài)信息,在本項(xiàng)目中,我們將使用Java的Swing庫來實(shí)現(xiàn)一個(gè)簡單的文字滾動(dòng)廣告字幕效果,通過定時(shí)更新文本的位置來模擬文字的滾動(dòng),需要的朋友可以參考下2025-02-02MyBatis-Plus使用sl4j日志打印SQL的代碼詳解
以下是關(guān)于使用 Spring Boot 起始器替換 slf4j-api 和 logback 依賴的詳細(xì)步驟和注意事項(xiàng),包括 MyBatis-Plus 的默認(rèn)日志級別信息,需要的朋友可以參考下2024-10-10SpringBoot獲取http數(shù)據(jù)、打印HTTP參數(shù)的4種方式
Java的話本地打斷點(diǎn)可以調(diào)試獲取rest入?yún)?但是在生產(chǎn)環(huán)境可能我們獲取入?yún)ⅲ℉ttp?header/parameter)可能就沒有那么的輕松了,所以本文給大家介紹了SpringBoot獲取http數(shù)據(jù)、打印HTTP參數(shù)的4種方式,需要的朋友可以參考下2024-03-03Java實(shí)現(xiàn)單機(jī)版五子棋游戲的示例代碼
五子棋是世界智力運(yùn)動(dòng)會(huì)競技項(xiàng)目之一,是一種兩人對弈的純策略型棋類游戲,是世界智力運(yùn)動(dòng)會(huì)競技項(xiàng)目之一。本文將用java語言實(shí)現(xiàn)單機(jī)版五子棋游戲,感興趣的可以了解一下2022-09-09SpringCloud搭建Eureka服務(wù)模塊的過程
Eureka在分布式系統(tǒng)中起到了連接各個(gè)微服務(wù)的紐帶作用,使得服務(wù)之間的交互變得更加靈活、可靠,本文將深入探討如何使用Spring?Cloud,逐步引導(dǎo)讀者完成Eureka服務(wù)模塊的搭建,感興趣的朋友跟隨小編一起看看吧2024-02-02SpringBoot啟動(dòng)自動(dòng)終止也不報(bào)錯(cuò)的原因及解決
這篇文章主要介紹了SpringBoot啟動(dòng)自動(dòng)終止也不報(bào)錯(cuò)的原因及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09