




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第Java實(shí)現(xiàn)定時(shí)任務(wù)本文實(shí)例為大家分享了Java實(shí)現(xiàn)定時(shí)任務(wù)的具體代碼,供大家參考,具體內(nèi)容如下
1使用java.util.Timer
這種方式的定時(shí)任務(wù)主要用到兩個(gè)類,Timer和TimerTask,使用起來比較簡單。其中Timer負(fù)責(zé)設(shè)定TimerTask的起始與間隔執(zhí)行時(shí)間。TimerTask是一個(gè)抽象類,new的時(shí)候?qū)崿F(xiàn)自己的run方法,然后將其丟給Timer去執(zhí)行即可。
代碼示例:
importjava.time.LocalDateTime;
importjava.util.Timer;
importjava.util.TimerTask;
publicclassSchedule{
publicstaticvoidmain(String[]args){
TimerTasktimerTask=newTimerTask(){
@Override
publicvoidrun(){
System.out.println("當(dāng)前線程:"+Thread.currentThread().getName()+"當(dāng)前時(shí)間"+LocalDateTime.now());
}
};
//在指定延遲0毫秒后開始,隨后地執(zhí)行以2000毫秒間隔執(zhí)行timerTask
newTimer().schedule(timerTask,0L,2000L);
System.out.println("當(dāng)前線程:"+Thread.currentThread().getName()+"當(dāng)前時(shí)間"+LocalDateTime.now());
}
}
缺點(diǎn):
Timer的背后只有一個(gè)線程,不管有多少個(gè)任務(wù),都只有一個(gè)工作線程串行執(zhí)行,效率低下受限于單線程,如果第一個(gè)任務(wù)邏輯上死循環(huán)了,后續(xù)的任務(wù)一個(gè)都得不到執(zhí)行依然是由于單線程,任一任務(wù)拋出異常后,整個(gè)Timer就會結(jié)束,后續(xù)任務(wù)全部都無法執(zhí)行
2使用ScheduledExecutorService
ScheduledExecutorService即是Timer的替代者,JDK1.5并發(fā)包引入,是基于線程池設(shè)計(jì)的定時(shí)任務(wù)類。每個(gè)調(diào)度任務(wù)都會分配到線程池中的某一個(gè)線程去執(zhí)行,任務(wù)就是并發(fā)調(diào)度執(zhí)行的,任務(wù)之間互不影響。
Java5.0引入了java.util.concurrent包,其中的并發(fā)實(shí)用程序之一是ScheduledThreadPoolExecutor,它是一個(gè)線程池,用于以給定的速率或延遲重復(fù)執(zhí)行任務(wù)。它實(shí)際上是Timer/TimerTask組合的更通用替代品,因?yàn)樗试S多個(gè)服務(wù)線程,接受各種時(shí)間單位,并且不需要子類TimerTask(只需實(shí)現(xiàn)Runnable)。使用一個(gè)線程配置ScheduledThreadPoolExecutor使其等效于Timer。
代碼示例:
importjava.time.LocalDateTime;
importjava.util.concurrent.*;
publicclassSchedule{
publicstaticvoidmain(String[]args){
//創(chuàng)建一個(gè)ScheduledThreadPoolExecutor線程池,核心線程數(shù)為5
ScheduledExecutorServicescheduledExecutorService=newScheduledThreadPoolExecutor(5);
//創(chuàng)建Runnable打印當(dāng)前線程和當(dāng)前時(shí)間
Runnabler=()-System.out.println("當(dāng)前線程:"+Thread.currentThread().getName()+"當(dāng)前時(shí)間"+LocalDateTime.now());
/**
*schedule:只執(zhí)行一次調(diào)度
*scheduleAtFixedRate:一開始就計(jì)算間隔時(shí)間,如果任務(wù)超過間隔時(shí)間,那么就直接開始下一個(gè)任務(wù)
*scheduleWithFixedDelay:任務(wù)無論執(zhí)行多久,都要等待上一輪任務(wù)完成之后再間隔指定時(shí)間,然后才開始下一個(gè)任務(wù)
*/
//在指定1秒延遲后執(zhí)行r,之后每兩秒執(zhí)行一次
scheduledExecutorService.scheduleAtFixedRate(r,1,2,TimeUnit.SECONDS);
}
}
3使用SpringTask
SpringTask底層是基于JDK的ScheduledThreadPoolExecutor線程池來實(shí)現(xiàn)的。直接通過Spring提供的@Scheduled注解即可定義定時(shí)任務(wù),非常方便。
以SpringBoot來作為示例,步驟為
1.在啟動類所在包下創(chuàng)建Schedule類(在沒有配置@ComponentScan的情況下,SpringBoot只會默認(rèn)掃描啟動類所在包的spring組件)
2.在該類上添加@Component和@EnableScheduling注解
3.在方法上添加@Scheduled注解,該注解主要參數(shù)如下
Stringcron()default"";
//支持cron表達(dá)式
longfixedDelay()default-1;
//在最后一次調(diào)用結(jié)束和下一次調(diào)用開始之間的時(shí)間間隔,以毫秒為單位
StringfixedDelayString()default"";
//同上,類似ScheduledExecutorService的scheduleWithFixedDelay
longfixedRate()default-1;
//在調(diào)用之前的時(shí)間間隔,以毫秒為單位
StringfixedRateString()default"";
//同上,類似ScheduledExecutorService的scheduleAtFixedRate
longinitialDelay()default-1;
//在第一次執(zhí)行fixedRate()或fixedDelay()任務(wù)之前要延遲的毫秒數(shù)
StringinitialDelayString()default"";
//同上
代碼示例:
importorg.springframework.scheduling.annotation.EnableScheduling;
importorg.springframework.scheduling.annotation.Scheduled;
importorg.springframework.stereotype.Component;
importjava.time.LocalDateTime;
@Component
@EnableScheduling
publicclassSchedule{
@Scheduled(fixedRate=2000L)
publicvoidtask(){
System.out.println("當(dāng)前線程:"+Thread.currentThread().getName()+"當(dāng)前時(shí)間"+LocalDateTime.now());
}
}
優(yōu)點(diǎn):簡單,輕量,支持Cron表達(dá)式缺點(diǎn):默認(rèn)只支持單機(jī),是單線程的,并且提供的功能比較單一
可以通過@EnableAsync和@Async開啟多線程
importorg.springframework.scheduling.annotation.Async;
importorg.springframework.scheduling.annotation.EnableAsync;
importorg.springframework.scheduling.annotation.EnableScheduling;
importorg.springframework.scheduling.annotation.Scheduled;
importorg.springframework.stereotype.Component;
importjava.time.LocalDateTime;
@Component
@EnableAsync
//開啟異步多線程
@EnableScheduling
publicclassSchedule{
@Async
@Scheduled(fixedRate=2000L)
publicvoidtask(){
System.out.println("當(dāng)前線程:"+Thread.currentThread().getName()+"當(dāng)前時(shí)間"+LocalDateTime.now());
}
}
使用@EnableAsync注解后,默認(rèn)情況下,Spring將搜索關(guān)聯(lián)的線程池定義:上下文中的唯一org.springframework.core.task.TaskExecutor
的bean,或者名為taskExecutor的java.util.concurrent.Executor
的bean。如果兩者都無法解析,則將使用org.springframework.core.task.SimpleAsyncTaskExecutor來處理異步方法調(diào)用。
TaskExecutor實(shí)現(xiàn)為每個(gè)任務(wù)啟動一個(gè)新線程,異步執(zhí)行它。支持通過concurrencyLimitbean屬性限制并發(fā)線程。默認(rèn)情況下,并發(fā)線程數(shù)是無限的,所以使用默認(rèn)的線程池有導(dǎo)致內(nèi)存溢出的風(fēng)險(xiǎn)。
注意:剛才的運(yùn)行結(jié)果看起來是線程復(fù)用的,而實(shí)際上此實(shí)現(xiàn)不重用線程!應(yīng)盡量實(shí)現(xiàn)一個(gè)線程池TaskExecutor,特別是用于執(zhí)行大量短期任務(wù)。不要使用默認(rèn)的SimpleAsyncTaskExecutor。
importorg.springframework.context.annotation.Bean;
importorg.springframework.scheduling.annotation.Async;
importorg.springframework.scheduling.annotation.EnableAsync;
importorg.springframework.scheduling.annotation.EnableScheduling;
importorg.springframework.scheduling.annotation.Scheduled;
importorg.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
importorg.springframework.stereotype.Component;
importjava.time.LocalDateTime;
importjava.util.concu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025初三升高一數(shù)學(xué)暑假銜接講義25講含答案(必修一內(nèi)容)5.6 三角函數(shù)倍角公式
- 統(tǒng)編版2025年七年級語文下學(xué)期期末總復(fù)習(xí)(專題訓(xùn)練)專題04文言文閱讀(考題猜想)(學(xué)生版+解析)
- 愛崗敬業(yè)14課件
- 考研復(fù)習(xí)-風(fēng)景園林基礎(chǔ)考研試題【奪冠】附答案詳解
- 風(fēng)景園林基礎(chǔ)考研資料試題及參考答案詳解【綜合題】
- 《風(fēng)景園林招投標(biāo)與概預(yù)算》試題A附參考答案詳解(考試直接用)
- 2025-2026年高校教師資格證之《高等教育法規(guī)》通關(guān)題庫含答案詳解(考試直接用)
- 泰州市2024-2025學(xué)年三年級下學(xué)期數(shù)學(xué)期末試題一(有答案)
- 2023國家能源投資集團(tuán)有限責(zé)任公司第一批社會招聘筆試備考題庫含答案詳解ab卷
- 2025年河北省定州市輔警招聘考試試題題庫及參考答案詳解一套
- 2025年市場營銷專業(yè)人才考核試題及答案
- 防范惡劣天氣安全教育
- 第七章郵輪游客投訴心理及處理技巧46課件
- 2025-2030年全球及中國槐糖脂行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報(bào)告
- 江蘇省無錫市天一實(shí)驗(yàn)學(xué)校2025屆物理八下期末調(diào)研試題含解析
- 深圳市住房公積金管理中心員額人員招聘真題2024
- 梅州市大埔縣客家圍屋小學(xué)-攜數(shù)同行靜待花開-二年級下冊數(shù)學(xué)家長會【課件】
- 耳鼻喉護(hù)理學(xué)試題及答案
- 第七單元專題學(xué)習(xí)活動:遨游漢字王國(精美課件)【知識提要】六年級語文下冊(統(tǒng)編版五四制2024)
- 2025年廣西高考?xì)v史模擬預(yù)測試卷(含答案解析)
- 河道生態(tài)修復(fù)與生物多樣性保護(hù)的生態(tài)水文過程模擬與生態(tài)修復(fù)優(yōu)化
評論
0/150
提交評論