Java實現(xiàn)并發(fā)執(zhí)行定時任務并手動控制開始結束
簡介
最近有一點富裕的時間,就想分享一下關于并發(fā)定時任務的內容,我也是查閱相關博客文檔并自己搗鼓出來的一點小思路,歡迎各路大佬批評指正…
應用場景
不知道大家對定時任務的使用情況是怎樣,就我個人而言接觸的也比較少一點,分享一下我的使用案例,簡單點一下使用場景。
最近需要獲取硬件相關的信息(傳感器信息)到平臺上進行一個展示,相信有一點經(jīng)驗的小伙伴應該了解與硬件交互需要涉及到心跳計時等等(就不細說了),所以就用到定時任務
我使用的是ThreadPoolTaskScheduler類來進行定時任務的控制的
下面是我寫的小Demo
代碼邏輯
代碼片(可直接運行)
package com.pj.apps.socket.tower;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ScheduledFuture;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
public class TaskTest {
//需要對它進行初始化
private static ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
//存儲定時任務編號及任務
private static Map<String,ScheduledFuture<?>> map = new HashMap<>();
//使用靜態(tài)代碼塊來初始化ThreadPoolTaskScheduler
static {
threadPoolTaskScheduler.initialize();
}
//開啟定時任務的方法
private static void startCron(String tNo) {
//通過使用它的方法來對任務進行開啟和關閉,使用Cron表達式,表示時間間隔并重復執(zhí)行
ScheduledFuture<?> future = threadPoolTaskScheduler.schedule(new MyRunnable(tNo), new CronTrigger("*/5 * * * * ?"));
map.put(tNo, future);
}
//停關閉定時任務
private static void closeCron(ScheduledFuture<?> future) {
if (future != null) {
future.cancel(true);
}
}
//定時任務線程
private static class MyRunnable implements Runnable {
private String tNo;
public MyRunnable(String tNo) {
this.tNo = tNo;
}
@Override
public void run() {
System.out.println("線程編號"+tNo+"定時任務邏輯內容...");
}
}
public static void main(String[] args) {
startCron("9527");
startCron("9528");
}
}
運行結果

思路簡單梳理
關于ThreadPoolTaskScheduler類更詳細使用可參考大佬們的文章或者百度,這里需要注意的是使用它需要進行初始化,我這里在靜態(tài)代碼塊中進行了初始化,也可以提出去初始化。
創(chuàng)建了一個map容器是為了存儲鍵值對【定時線程編號】以及對應的【定時線程】,可以方便我們后面可以很好的對每個定時任務進行關閉,因為關閉定時器的方法中需要傳的參數(shù)是一個定時任務ScheduledFuture,所以我們可以通過線程編號去找到它,再進行一個關閉。
通過Cron表達式來描述定時周期,我這里設置的是每隔5秒執(zhí)行一次,小伙伴們自行去了解一下Cron表達式。
自定義了一個任務內容主體線程類MyRunnable,將需要定時執(zhí)行的邏輯放到這個里面去,這里還用了一個帶參構造,方便我們傳一些參數(shù)加入到執(zhí)行定時邏輯里面去,我這里構造傳的是模擬的線程編號,需要傳其他更多的參數(shù)可以同樣的方法進行參數(shù)的傳遞。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Mybatis in條件傳參的三種實現(xiàn)方式(直接$,List,[])
這篇文章主要介紹了Mybatis in條件傳參的三種實現(xiàn)方式(直接$,List,[]),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
使用Postman自動生成Cookie并轉換為Java代碼的實現(xiàn)
在接口測試中,有時候需要在請求中攜帶Cookie信息,為了方便測試,我們可以使用Postman來自動生成Cookie,并將其轉換為Java代碼,以便在自動化測試中使用,下面將介紹如何實現(xiàn)這一功能,需要的朋友可以參考下2024-11-11
深入淺析Java中Static Class及靜態(tài)內部類和非靜態(tài)內部類的不同
上次有朋友問我,java中的類可以是static嗎?我給他肯定的回答是可以的,在java中我們可以有靜態(tài)實例變量、靜態(tài)方法、靜態(tài)塊。當然類也可以是靜態(tài)的,下面小編整理了些關于java中的static class相關資料分享在腳本之家平臺供大家參考2015-11-11

