ScheduledThreadPoolExecutor 的創建
ScheduledThreadPoolExecutor executorService = new ScheduledThreadPoolExecutor(1, // 核心線程數new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d") // 線程命名規則.daemon(true) // 設置線程為守護線程.build()
);
這里創建了一個大小為1的定時任務線程池,使用了 BasicThreadFactory
來設置線程的命名規則為 “example-schedule-pool-1”,并將線程設置為守護線程。
定時任務的執行
executorService.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {try {new LoginViewTimeTask().loginStatisticsHandle();} catch (Exception e) {Global.getInstance().LogError(e);}}},1000 * 60, // 初次執行延遲時間,這里是1分鐘1000 * 60 * 60 * 24, // 固定間隔時間,這里是1天TimeUnit.HOURS // 時間單位,這里是小時
);
這里使用 scheduleAtFixedRate
方法安排一個任務,該任務是一個 Runnable
匿名類,其 run
方法中調用了 new LoginViewTimeTask().loginStatisticsHandle()
方法。這個任務將在初始延遲后以固定的時間間隔重復執行。
具體參數解釋
- 初次執行延遲時間:
1000 * 60
毫秒,即1分鐘。 - 固定間隔時間:
1000 * 60 * 60 * 24
毫秒,即1天。 - 時間單位:
TimeUnit.HOURS
,表示以上時間參數的單位是小時。
總體來說,這段代碼的作用是創建一個定時任務,每隔一天執行一次 LoginViewTimeTask
類中的 loginStatisticsHandle
方法,初次執行延遲1分鐘。如果 loginStatisticsHandle
方法中的邏輯是定期執行的任務,這樣的定時任務可以用于定期統計登錄信息。
ScheduledThreadPoolExecutor
本身沒有直接提供設置初始執行時間的方法,但你可以通過計算初始延遲來實現類似的效果。可以使用 System.currentTimeMillis()
獲取當前時間戳,然后計算出距離下一次執行的時間差。
設置初始執行時間
以下是一個示例代碼,演示了如何在 ScheduledThreadPoolExecutor
中設置初始執行時間:
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) {// 創建一個 ScheduledExecutorServiceScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);// 獲取當前時間long currentTimeMillis = System.currentTimeMillis();// 計算距離下一次執行的時間差(假設下一次執行是明天的這個時刻)Calendar calendar = Calendar.getInstance();calendar.add(Calendar.DAY_OF_YEAR, 1);calendar.set(Calendar.HOUR_OF_DAY, 12); // 設置小時calendar.set(Calendar.MINUTE, 0); // 設置分鐘calendar.set(Calendar.SECOND, 0); // 設置秒calendar.set(Calendar.MILLISECOND, 0); // 設置毫秒long initialDelay = calendar.getTimeInMillis() - currentTimeMillis;// 執行任務,每隔一天執行一次executorService.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {// 任務邏輯System.out.println("Task executed at: " + new Date());}},initialDelay, // 初始延遲時間24, // 間隔時間TimeUnit.HOURS // 時間單位);}
}
在這個例子中,initialDelay
計算了當前時間到明天的指定時刻的時間差。這樣,第一次執行任務的時間就被設定為明天的這個時刻。后續的任務將會在每隔24小時執行一次。你可以根據需要調整計算初始延遲的邏輯。