前言:可用于定时轮询和延时轮询任务的场景,比如心跳轮询到服务器主动获取消息,采用线程池实现,可以开启多个任务。
/**
* desc:优点除了线程池的特性以外,可以实现循环或延迟任务
*
* @author Zach
* create 2024/7/3 10:32
*/
public class HeartBeatTools {
private static final String TAG = HeartBeatTools.class.getSimpleName();
private ScheduledExecutorService mScheduledExecutorService;
private HashMap<String, Future> map;
/**
* 单例设计模式(饿汉式)
* 单例首先私有化构造方法,然后饿汉式一开始就开始创建,并提供get方法
*/
private static HeartBeatTools mInstance = new HeartBeatTools();
public static HeartBeatTools getInstance() {
return mInstance;
}
/**
* 初始化
*/
private HeartBeatTools() {
// 线程池大小5
mScheduledExecutorService = Executors.newScheduledThreadPool(5);
map = new HashMap<>();
}
/**
* 获取任务总数
*/
public int getTaskNum() {
return map == null ? 0 : map.size();
}
/**
* @param task 开始一个心跳任务
* @param initialDelay 初始延迟时间
* @param period 多长时间执行一次
* @param unit 单位 TimeUnit.SECONDS,TimeUnit.MILLISECONDS
*/
public void startTheBeatAction(HeartBeatTask task, long initialDelay, long period, TimeUnit unit) {
if (map.containsKey(task.getTaskName())) {
MyLog.d(TAG, "心跳正在进行,无需重复添加");
return;
}
Future future = mScheduledExecutorService.scheduleAtFixedRate(task, initialDelay, period, unit);
map.put(task.getTaskName(), future);
}
/**
* @param task 关闭指定的心跳任务
*/
public void shutDownTheBeatAction(HeartBeatTask task) {
Future future = map.get(task.getTaskName());
// 传入true会中断线程停止任务
if (future != null) {
future.cancel(true);
map.remove(task.getTaskName());
} else {
MyLog.d(TAG, "你指定的这个心跳任务已经不存在,无需关闭");
}
}
/**
* @param task 开启延时任务
* @param delayTime 延时时间
*/
public void startDelayedAction(HeartBeatTask task, int delayTime) {
mScheduledExecutorService.schedule(task, delayTime, TimeUnit.MILLISECONDS);
}
/**
* 销毁所有变量
*/
public void shutDownAll() {
if (mScheduledExecutorService != null) {
// 强制关闭
mScheduledExecutorService.shutdownNow();
mScheduledExecutorService = null;
}
map.clear();
map = null;
}
}
/**
* desc:开启任务
*
* @author Zach
* create 2024/7/3 10:32
*/
public class HeartBeatTask implements Runnable {
private String taskName;
public HeartBeatTask(String taskName) {
// this.taskName = "beatTask_" + System.nanoTime();
this.taskName = taskName;
}
String getTaskName() {
return taskName;
}
@Override
public void run() {
switch (taskName) {
case Constants.ACTION_LOGIN:
HttpReqFunManager.getInstance().requestLogin();
break;
default:
break;
}
}
}
调用开启和结束
HeartBeatTools.getInstance().startTheBeatAction(new HeartBeatTask(Constants.ACTION_LOGIN)
, 0, 5, TimeUnit.SECONDS);
HeartBeatTools.getInstance().shutDownAll();