Java實現(xiàn)定時器的4種方法超全總結(jié)
前言
Java實現(xiàn)定時器的方法有很多,本章主要淺談一下知道的幾種方法:
方法1:使用Timer和和TimerTask類
1、Timer和TimerTask是java.util包下的類,用于實現(xiàn)定時任務(wù)
步驟1:創(chuàng)建TimerTask定時器任務(wù),可以通過匿名內(nèi)部類的方式創(chuàng)建
步驟2:創(chuàng)建Timer定時器,調(diào)用定時器的方法執(zhí)行定時器任務(wù)
2、Timer的兩個方法schedule()和scheduleAtFixedRate()及其重載方法:
void schedule(TimerTask task, long delay):在指定時間后執(zhí)行1次任務(wù),其中delay表示時延,單位是毫秒,設(shè)置為1000,則表示1秒后執(zhí)行一次定時器任務(wù);
void schedule(TimerTask task, long delay, long period):指定延遲指定時間后周期性地執(zhí)行任務(wù)(delay毫秒后,每period毫秒執(zhí)行一次)
void scheduleAtFixedRate(TimerTask task, long delay, long period):指定延遲指定時間后周期性地執(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)建定時器
Timer timer = new Timer();
// 創(chuàng)建定時器任務(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是一個枚舉類型,用于指定時間單位,有NANOSECONDS(納秒)、MICROSECONDS(微秒)、MILISECONDS(毫秒)、SECONDS(秒)、MINUTE(分鐘)、HOURS(小時)和DAYS(天)。
案例代碼:
public class TimerExample {
public static void main(String[] args) {
// 創(chuàng)建定時器任務(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啟動類上添加@EnableScheduling注解
@EnableScheduling
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}步驟2:創(chuàng)建一個定時任務(wù)類的bean,在類的方法上使用@Schedule注解,通過注解的cron屬性設(shè)置定時器的屬性
@Component
public class TimerTask {
@Scheduled(cron = "0 7 2 26 7 *")
public void task() {
System.out.println("定時任務(wù)...");
}
}以上代碼指定在2022年7月26日02:07:00執(zhí)行一次定時任務(wù),對cron表達式感興趣的可以去學(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)建一個JobDetail(工作詳情)類對象,保存到Spring容器中,這個類用于封裝我們編寫的job接口實現(xiàn)類
@Bean
public JobDetail jobDetail(){
System.out.println("showTime方法運行");
return JobBuilder.newJob(QuartzJob.class) // 綁定要運行的任務(wù)類的類對象
.withIdentity("job") // 設(shè)置job的名稱
.storeDurably() // 信息持久
// 設(shè)置storeDurably之后,當沒有觸發(fā)器指向這個JobDetail時,JobDetail也不會從
// Spring容器中刪除,如果不設(shè)置這行,就會自動從Spring容器中刪除
.build();
}
// 聲明觸發(fā)器,觸發(fā)器決定我們的工作\任務(wù)何時觸發(fā)
@Bean
public Trigger trigger(){
System.out.println("showTime觸發(fā)器運行");
// 定義Cron表達式,每分鐘觸發(fā)一次
CronScheduleBuilder cronScheduleBuilder =
CronScheduleBuilder.cronSchedule("0/10 * * * * ?");
return TriggerBuilder.newTrigger()
.forJob(jobDetail()) // 綁定JobDetail對象
.withIdentity("trigger") // 定義觸發(fā)器名稱
.withSchedule(cronScheduleBuilder) // 綁定Cron表達式
.build();
}
}步驟:3:定義Job
public class QuartzJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) {
// 輸出當前時間
System.out.println(LocalDateTime.now());
}
}總結(jié)
到此這篇關(guān)于Java實現(xiàn)定時器的4種方法的文章就介紹到這了,更多相關(guān)Java實現(xiàn)定時器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Activiti explorer.war示例工程使用過程圖解
這篇文章主要介紹了Activiti explorer.war示例工程使用過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03
PowerJob的IdGenerateService工作流程源碼解讀
這篇文章主要為大家介紹了PowerJob的IdGenerateService工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01
SpringBoot 統(tǒng)一公共返回類的實現(xiàn)
本文主要介紹了SpringBoot 統(tǒng)一公共返回類的實現(xiàn),配置后臺的統(tǒng)一公共返回類,這樣做目的是為了統(tǒng)一返回信息,文中示例代碼介紹的很詳細,感興趣的可以了解一下2022-01-01
logback FixedWindowRollingPolicy固定窗口算法重命名文件滾動策略
這篇文章主要介紹了FixedWindowRollingPolicy根據(jù)logback 固定窗口算法重命名文件滾動策略源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11

