Java可自定義中斷定時器的實現
Java定時器的實現一般使用的是Timer和ScheduledExecutorService
- 使用Timer的時候需要自定義一個task繼承TimerTask,在task中封裝業務邏輯
然後再使用Timer.scheduleAtFixedRate 按照固定速率執行task中的邏輯
本文介紹的是ScheduledExecutorService來實現可中斷定時器
我們首先看一下scheduleAtFixedRate 的javaDoc
- If any execution of the task encounters an exception, subsequent executions are suppressed.Otherwise, the task will only terminate via cancellation or termination of the executor.
通過javaDoc可以發現需要終止task的方法有三種:
- 執行shutdown(),但是這個會終止整個Executor
- task丟擲異常,在task執行到需要中斷的時候,丟擲異常
- 取消當前執行的task
執行shutdown()肯定是不合適的,通過主動拋異常的方式來中斷也不好
所以使用取消當前task的方式來實現自定義中斷
- 首先看一下scheduleAtFixedRate的原始碼,我們注意到這個方法返回的是ScheduledFuture<?>
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit);
ScheduledFuture是繼承了Future的
public interface ScheduledFuture<V> extends Delayed, Future<V>
這樣就可以通過Future.cancel()的方式來取消當前task實現自定義中斷
- 初始化ScheduledExecutorService 執行緒池
private ScheduledExecutorService service = Executors.newScheduledThreadPool(20,new NamedThreadFactory("Schedule-Task"));
- 實現業務邏輯和退出條件
實現思路是通過儲存每個task的Future物件,在滿足條件是,執行future.cancel()
// 當前正在執行的task合集
private Map<String,Future> futures = new HashMap<>();
// 執行定時任務的時間間隔
private int period = 5;
private String taskPrefix ="DoSomething-Task";
public void executeTask(String id) {
// 已有當前定時任務在執行時,刪掉當前任務,然後重新啟動
if (futures.containsKey(taskPrefix+id)) {
futures.get(taskPrefix+id).cancel(true);
futures.remove(taskPrefix+id);
}
Future future = service.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
int currentNum = cacheService.getCurrentShowNum(id);
// 滿足中斷task條件
if ( /* 條件邏輯 */) {
Future currentFuture = futures.get(taskPrefix+id);
currentFuture.cancel(true);
// 任務執行完成
futures.remove(taskPrefix+id);
} else {
// 執行task業務邏輯
}
}
},0,period, TimeUnit.MINUTES);
futures.put(taskPrefix+id,future);
}
相關文章
- 使用者自定義定時任務的php實現PHP
- Spring 定時器的使用—Xml、Annotation、自定義Spring定時器XML
- Spring 定時器的使用---Xml、Annotation、自定義Spring定時器XML
- 【JAVA】自定義類載入器實現類隔離Java
- java springboot 實現定時器任務JavaSpring Boot定時器
- java 中定時器Java定時器
- 列印可自定義的字母金字塔(python實現)Python
- 實現MyBatisPlus自定義sql注入器MyBatisSQL
- 原來定時器中斷是個偽中斷定時器
- 介面測試--自定義斷言設定
- JAVA中的Comparable介面和自定義比較器Java
- QT實現可拖動自定義控制元件QT控制元件
- Java設計模式-17、直譯器模式-自定義語言的實現Java設計模式
- EventSource的自定義實現
- @Scheduled 定時任務自定義
- 深入 Java Timer 定時排程器實現原理Java
- 51模組_定時器與中斷定時器
- .NET中如何實現高精度定時器定時器
- Java 實現音訊新增自定義時長靜音(附程式碼) | Java工具類Java音訊
- vue中elementUI的表格實現自定義編輯VueUI
- 聊聊自定義SPI如何與sentinel整合實現熔斷限流
- .Net Core中自定義認證實現
- Flutter自定義View的實現FlutterView
- Flutter自定義Banner的實現Flutter
- 工作記錄--WPF自定義控制元件,實現一個可設定編輯模式的TextBox控制元件模式
- Android自定義View:快遞時間軸實現AndroidView
- Android 自定義 View 實現橫行時間軸AndroidView
- 自定義時間選擇器
- C++定時器CTimer的實現C++定時器
- 如何用 Java 實現 Web 應用中的定時任務?JavaWeb
- OpenAPI生成器中實現自定義模板API
- 在Vue3中實現自定義指令Vue
- SpringBoot中搭配AOP實現自定義註解Spring Boot
- java中SpringBoot定時器註解JavaSpring Boot定時器
- 深入 Java Timer 定時任務排程器實現原理Java
- macOS自定義定時開關機教程Mac
- 使用client-go實現自定義控制器clientGo
- Java如何實現定時任務?Java
- 【Cesium 顏狗初步】fabric 材質定義與自定義著色器實踐