Java定時任務(wù)ScheduledThreadPoolExecutor示例詳解
ScheduledThreadPoolExecutor 的創(chuàng)建
ScheduledThreadPoolExecutor executorService = new ScheduledThreadPoolExecutor( 1, // 核心線程數(shù) new BasicThreadFactory.Builder() .namingPattern("example-schedule-pool-%d") // 線程命名規(guī)則 .daemon(true) // 設(shè)置線程為守護線程 .build() );
這里創(chuàng)建了一個大小為1的定時任務(wù)線程池,使用了 BasicThreadFactory
來設(shè)置線程的命名規(guī)則為 “example-schedule-pool-1”,并將線程設(shè)置為守護線程。
定時任務(wù)的執(zhí)行
executorService.scheduleAtFixedRate( new Runnable() { @Override public void run() { try { new LoginViewTimeTask().loginStatisticsHandle(); } catch (Exception e) { Global.getInstance().LogError(e); } } }, 1000 * 60, // 初次執(zhí)行延遲時間,這里是1分鐘 1000 * 60 * 60 * 24, // 固定間隔時間,這里是1天 TimeUnit.HOURS // 時間單位,這里是小時 );
這里使用 scheduleAtFixedRate
方法安排一個任務(wù),該任務(wù)是一個 Runnable
匿名類,其 run
方法中調(diào)用了 new LoginViewTimeTask().loginStatisticsHandle()
方法。這個任務(wù)將在初始延遲后以固定的時間間隔重復(fù)執(zhí)行。
具體參數(shù)解釋
- 初次執(zhí)行延遲時間:
1000 * 60
毫秒,即1分鐘。 - 固定間隔時間:
1000 * 60 * 60 * 24
毫秒,即1天。 - 時間單位:
TimeUnit.HOURS
,表示以上時間參數(shù)的單位是小時。
總體來說,這段代碼的作用是創(chuàng)建一個定時任務(wù),每隔一天執(zhí)行一次 LoginViewTimeTask
類中的 loginStatisticsHandle
方法,初次執(zhí)行延遲1分鐘。如果 loginStatisticsHandle
方法中的邏輯是定期執(zhí)行的任務(wù),這樣的定時任務(wù)可以用于定期統(tǒng)計登錄信息。ScheduledThreadPoolExecutor
本身沒有直接提供設(shè)置初始執(zhí)行時間的方法,但你可以通過計算初始延遲來實現(xiàn)類似的效果。可以使用 System.currentTimeMillis()
獲取當(dāng)前時間戳,然后計算出距離下一次執(zhí)行的時間差。
設(shè)置初始執(zhí)行時間
以下是一個示例代碼,演示了如何在 ScheduledThreadPoolExecutor
中設(shè)置初始執(zhí)行時間:
import java.util.Calendar; import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ScheduledTaskExample { public static void main(String[] args) { // 創(chuàng)建一個 ScheduledExecutorService ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); // 獲取當(dāng)前時間 long currentTimeMillis = System.currentTimeMillis(); // 計算距離下一次執(zhí)行的時間差(假設(shè)下一次執(zhí)行是明天的這個時刻) Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DAY_OF_YEAR, 1); calendar.set(Calendar.HOUR_OF_DAY, 12); // 設(shè)置小時 calendar.set(Calendar.MINUTE, 0); // 設(shè)置分鐘 calendar.set(Calendar.SECOND, 0); // 設(shè)置秒 calendar.set(Calendar.MILLISECOND, 0); // 設(shè)置毫秒 long initialDelay = calendar.getTimeInMillis() - currentTimeMillis; // 執(zhí)行任務(wù),每隔一天執(zhí)行一次 executorService.scheduleAtFixedRate( new Runnable() { @Override public void run() { // 任務(wù)邏輯 System.out.println("Task executed at: " + new Date()); } }, initialDelay, // 初始延遲時間 24, // 間隔時間 TimeUnit.HOURS // 時間單位 ); } }
在這個例子中,initialDelay
計算了當(dāng)前時間到明天的指定時刻的時間差。這樣,第一次執(zhí)行任務(wù)的時間就被設(shè)定為明天的這個時刻。后續(xù)的任務(wù)將會在每隔24小時執(zhí)行一次。你可以根據(jù)需要調(diào)整計算初始延遲的邏輯。
到此這篇關(guān)于Java定時任務(wù) ScheduledThreadPoolExecutor的文章就介紹到這了,更多相關(guān)Java定時任務(wù) ScheduledThreadPoolExecutor內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決springboot項目啟動報錯Error creating bean with&nb
這篇文章主要介紹了解決springboot項目啟動報錯Error creating bean with name dataSourceScriptDatabaseInitializer問題,具有很好的參考價值,希望對大家有所幫助2024-03-03利用JSONObject.toJSONString()包含或排除指定的屬性
這篇文章主要介紹了利用JSONObject.toJSONString()包含或排除指定的屬性,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03Mockito 結(jié)合 Springboot 進行應(yīng)用測試的方法詳解
這篇文章主要介紹了Mockito 結(jié)合 Springboot 進行應(yīng)用測試的方法詳解,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11Java項目開發(fā)命名規(guī)范(動力節(jié)點Java學(xué)院整理)
定義這個規(guī)范的目的是讓項目中所有的文檔都看起來像一個人寫的,增加可讀性,減少項目組中因為換人而帶來的損失。下面給大家分享java開發(fā)命名規(guī)范,一起看看吧2017-03-03