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】自定義類載入器實現類隔離Java
- 原來定時器中斷是個偽中斷定時器
- 51模組_定時器與中斷定時器
- ASP.NET中自定義DataGrid分頁設定的實現ASP.NET
- C中atoi和strcpy的自定義實現
- C#定時器中呼叫WCF服務+自定義回撥函式C#定時器函式
- 介面測試--自定義斷言設定
- .NET中如何實現高精度定時器定時器
- QT實現可拖動自定義控制元件QT控制元件
- 列印可自定義的字母金字塔(python實現)Python
- @Scheduled 定時任務自定義
- 實現MyBatisPlus自定義sql注入器MyBatisSQL
- java springboot 實現定時器任務JavaSpring Boot定時器
- Java設計模式-17、直譯器模式-自定義語言的實現Java設計模式
- Java 實現音訊新增自定義時長靜音(附程式碼) | Java工具類Java音訊
- EventSource的自定義實現
- JAVA中的Comparable介面和自定義比較器Java
- Java中的註解-自定義註解處理器Java
- RecycleView自定義ItemDecoration,實現時間軸效果View
- 自定義View:畫布實現自定義View(折線圖的實現)View
- .Net Core中自定義認證實現
- UWP中實現自定義標題欄
- 自定義View:自定義屬性(自定義按鈕實現)View
- vue中elementUI的表格實現自定義編輯VueUI
- 聊聊自定義SPI如何與sentinel整合實現熔斷限流
- IE瀏覽器 自定義地址協議的實現瀏覽器協議
- 自定義語言的實現——直譯器模式(五)模式
- 自定義語言的實現——直譯器模式(四)模式
- 自定義語言的實現——直譯器模式(三)模式
- 自定義語言的實現——直譯器模式(二)模式
- Flutter自定義Banner的實現Flutter
- Flutter自定義View的實現FlutterView
- 自定義時間選擇器