Java中ScheduledExecutorService的使用方法詳解
ScheduledExecutorService 簡(jiǎn)介
ScheduledExecutorService是ExecutorService的一個(gè)子接口。它主要用于在給定的延遲之后或周期性地執(zhí)行任務(wù)。這個(gè)接口提供了一種方便的方式來(lái)處理異步任務(wù)的調(diào)度,相比于傳統(tǒng)的Timer和TimerTask,它具有更好的靈活性和可靠性,特別是在處理多線程環(huán)境下的任務(wù)調(diào)度時(shí)。
我們可以通過(guò)ScheduledExecutorService,更有效地管理和調(diào)度多個(gè)異步任務(wù),這些任務(wù)可以是一次性執(zhí)行的,也可以是周期性重復(fù)執(zhí)行的。
常用方法
schedule
schedule(Runnable command, long delay, TimeUnit unit)
功能描述:該方法用于安排一個(gè)任務(wù)(Runnable)在指定的延遲(delay)之后執(zhí)行一次。TimeUnit是一個(gè)枚舉類(lèi)型,用于指定延遲的時(shí)間單位,例如TimeUnit.SECONDS表示秒,TimeUnit.MILLISECONDS表示毫秒等。
示例代碼:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Runnable task = () -> System.out.println("任務(wù)在延遲后執(zhí)行");
scheduler.schedule(task, 5, TimeUnit.SECONDS);
scheduler.shutdown();
解釋?zhuān)涸谶@個(gè)示例中,首先通過(guò)Executors.newScheduledThreadPool(1)創(chuàng)建了一個(gè)ScheduledExecutorService對(duì)象,線程池大小為 1。然后定義了一個(gè)Runnable任務(wù),該任務(wù)只是簡(jiǎn)單地打印一條消息。接著使用schedule方法安排這個(gè)任務(wù)在 5 秒(TimeUnit.SECONDS)后執(zhí)行。最后調(diào)用shutdown方法來(lái)優(yōu)雅地關(guān)閉ScheduledExecutorService,防止資源泄漏。
scheduleAtFixedRate
scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
功能描述:用于安排一個(gè)任務(wù)在初始延遲(initialDelay)之后開(kāi)始執(zhí)行,然后以固定的頻率(period)重復(fù)執(zhí)行。如果任務(wù)的執(zhí)行時(shí)間超過(guò)了指定的周期(period),下一次執(zhí)行會(huì)在當(dāng)前任務(wù)執(zhí)行完成后立即開(kāi)始,不會(huì)等待一個(gè)完整的周期。
示例代碼:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Runnable task = () -> System.out.println("周期性任務(wù)執(zhí)行");
scheduler.scheduleAtFixedRate(task, 2, 3, TimeUnit.SECONDS);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
scheduler.shutdown();
解釋?zhuān)涸谶@個(gè)例子中,任務(wù)會(huì)在 2 秒(initialDelay)后首次執(zhí)行,然后每隔 3 秒(period)執(zhí)行一次。通過(guò)Thread.sleep(10000)讓主線程等待一段時(shí)間,以便觀察任務(wù)的周期性執(zhí)行。最后關(guān)閉ScheduledExecutorService。
scheduleWithFixedDelay
scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
功能描述:安排一個(gè)任務(wù)在初始延遲(initialDelay)之后開(kāi)始執(zhí)行,并且在每次執(zhí)行完成后,等待固定的延遲(delay)時(shí)間后再執(zhí)行下一次任務(wù)。這與scheduleAtFixedRate不同,scheduleAtFixedRate是按照固定的頻率執(zhí)行,而這個(gè)方法是在上一次任務(wù)執(zhí)行完成后等待固定的延遲時(shí)間再執(zhí)行下一次。
示例代碼:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Runnable task = () -> {
System.out.println("任務(wù)開(kāi)始執(zhí)行");
try {
Thread.sleep(2000); // 模擬任務(wù)執(zhí)行時(shí)間
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("任務(wù)執(zhí)行完成");
};
scheduler.scheduleWithFixedDelay(task, 2, 3, TimeUnit.SECONDS);
try {
Thread.sleep(15000);
} catch (InterruptedException e) {
e.printStackTrace();
}
scheduler.shutdown();
解釋?zhuān)涸谶@個(gè)示例中,任務(wù)首先在 2 秒(initialDelay)后開(kāi)始執(zhí)行。任務(wù)本身會(huì)模擬執(zhí)行 2 秒(通過(guò)Thread.sleep(2000)),然后在任務(wù)執(zhí)行完成后,等待 3 秒(delay)再執(zhí)行下一次任務(wù)。通過(guò)Thread.sleep(15000)讓主線程等待足夠長(zhǎng)的時(shí)間來(lái)觀察任務(wù)的執(zhí)行情況,最后關(guān)閉ScheduledExecutorService。
關(guān)于shutdown
關(guān)閉釋放資源: 雖然JVM會(huì)自動(dòng)回收資源,但是為防止內(nèi)存泄漏,還是建議每次執(zhí)行完成后都添加shutdown()方法,我們可以根據(jù)不同場(chǎng)景選擇不同的關(guān)閉方法
// 等待所有任務(wù)完成才去執(zhí)行關(guān)閉
executor.shutdown();
// 如果需要立即關(guān)閉并嘗試中斷任務(wù)
executor.shutdownNow();
// 指定等待時(shí)間來(lái)等待執(zhí)行完成
executor.awaitTermination(long timeout, TimeUnit unit) // 如果在等待時(shí)間內(nèi)執(zhí)行器成功關(guān)閉,該方法將返回true;否則返回false
到此這篇關(guān)于Java中ScheduledExecutorService的使用方法詳解的文章就介紹到這了,更多相關(guān)Java ScheduledExecutorService內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring IOC的相關(guān)注解運(yùn)用詳解
這篇文章主要介紹了Spring IOC的相關(guān)注解運(yùn)用詳解,純注解實(shí)現(xiàn)IOC需要一個(gè)Java類(lèi)代替xml文件,這個(gè)Java類(lèi)上方需要添加@Configuration,表示該類(lèi)是一個(gè)配置類(lèi),作用是代替配置文件,需要的朋友可以參考下2023-08-08
Java Management Extensions管理擴(kuò)展原理解析
這篇文章主要介紹了Java Management Extensions管理擴(kuò)展原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Java快速批量移動(dòng)文件的實(shí)現(xiàn)方法
這篇文章主要介紹了Java快速批量移動(dòng)文件的實(shí)現(xiàn)方法,需要的朋友可以參考下2014-03-03
Java通過(guò)模板替換實(shí)現(xiàn)excel的傳參填寫(xiě)方式
文章介紹了使用Java模板替換功能來(lái)實(shí)現(xiàn)Excel文件的傳參填寫(xiě),通過(guò)將模板中的占位符(如$)進(jìn)行轉(zhuǎn)義和替換,可以動(dòng)態(tài)生成包含具體數(shù)據(jù)的Excel文件,這種方法適用于需要批量生成帶有個(gè)性化數(shù)據(jù)的Excel文檔的場(chǎng)景2025-12-12
Spring?模擬轉(zhuǎn)賬開(kāi)發(fā)實(shí)戰(zhàn)小結(jié)
轉(zhuǎn)賬是金融類(lèi)應(yīng)用的核心場(chǎng)景之一,涉及付款方扣減金額和收款方增加金額兩個(gè)關(guān)鍵操作,本文主要介紹了Spring?模擬轉(zhuǎn)賬開(kāi)發(fā)實(shí)戰(zhàn)小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2025-05-05
spring-boot中使用spring-boot-devtools的實(shí)現(xiàn)代碼
這篇文章主要介紹了spring-boot中使用spring-boot-devtools的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
SpringValidation自定義注解及分組校驗(yàn)功能詳解
這篇文章主要介紹了SpringValidation自定義注解及分組校驗(yàn)功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01

