Java中ScheduledExecutorService的使用方法詳解
ScheduledExecutorService 簡(jiǎn)介
ScheduledExecutorService是ExecutorService的一個(gè)子接口。它主要用于在給定的延遲之后或周期性地執(zhí)行任務(wù)。這個(gè)接口提供了一種方便的方式來處理異步任務(wù)的調(diào)度,相比于傳統(tǒng)的Timer和TimerTask,它具有更好的靈活性和可靠性,特別是在處理多線程環(huán)境下的任務(wù)調(diào)度時(shí)。
我們可以通過ScheduledExecutorService,更有效地管理和調(diào)度多個(gè)異步任務(wù),這些任務(wù)可以是一次性執(zhí)行的,也可以是周期性重復(fù)執(zhí)行的。
常用方法
schedule
schedule(Runnable command, long delay, TimeUnit unit)
功能描述:該方法用于安排一個(gè)任務(wù)(Runnable)在指定的延遲(delay)之后執(zhí)行一次。TimeUnit是一個(gè)枚舉類型,用于指定延遲的時(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();
解釋:在這個(gè)示例中,首先通過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方法來優(yōu)雅地關(guān)閉ScheduledExecutorService,防止資源泄漏。
scheduleAtFixedRate
scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
功能描述:用于安排一個(gè)任務(wù)在初始延遲(initialDelay)之后開始執(zhí)行,然后以固定的頻率(period)重復(fù)執(zhí)行。如果任務(wù)的執(zhí)行時(shí)間超過了指定的周期(period),下一次執(zhí)行會(huì)在當(dāng)前任務(wù)執(zhí)行完成后立即開始,不會(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();
解釋:在這個(gè)例子中,任務(wù)會(huì)在 2 秒(initialDelay)后首次執(zhí)行,然后每隔 3 秒(period)執(zhí)行一次。通過Thread.sleep(10000)讓主線程等待一段時(shí)間,以便觀察任務(wù)的周期性執(zhí)行。最后關(guān)閉ScheduledExecutorService。
scheduleWithFixedDelay
scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
功能描述:安排一個(gè)任務(wù)在初始延遲(initialDelay)之后開始執(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ù)開始執(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();
解釋:在這個(gè)示例中,任務(wù)首先在 2 秒(initialDelay)后開始執(zhí)行。任務(wù)本身會(huì)模擬執(zhí)行 2 秒(通過Thread.sleep(2000)),然后在任務(wù)執(zhí)行完成后,等待 3 秒(delay)再執(zhí)行下一次任務(wù)。通過Thread.sleep(15000)讓主線程等待足夠長(zhǎng)的時(shí)間來觀察任務(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í)間來等待執(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)文章
Java中l(wèi)ogback?自動(dòng)刷新不生效的問題解決
本文主要介紹了Java中l(wèi)ogback?自動(dòng)刷新不生效的問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05Java實(shí)現(xiàn)銀行ATM系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)銀行ATM系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04使用Java動(dòng)態(tài)創(chuàng)建Flowable會(huì)簽?zāi)P偷氖纠a
動(dòng)態(tài)創(chuàng)建流程模型,尤其是會(huì)簽(Parallel Gateway)模型,是提升系統(tǒng)靈活性和響應(yīng)速度的關(guān)鍵技術(shù)之一,本文將通過Java編程語言,深入探討如何在運(yùn)行時(shí)動(dòng)態(tài)地創(chuàng)建包含會(huì)簽環(huán)節(jié)的Flowable流程模型,需要的朋友可以參考下2024-05-05