java没有setTimeout这种东西 所以自己写了一个
这里这个异步的方法必须使用synchronized参数
package com.junction.util;
import java.time.Instant;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class DelayTimeUtil {
// 存放定时任务
private static Map<String, Long> _TaskMap = new HashMap<>();
public static void delayTimeExec(DelayRunClass delayRunClass, String taskName, int delayTime) {
_TaskMap.put(taskName, Instant.now().plusSeconds(delayTime).toEpochMilli()); // 延迟 3s
// 调用无限循环实现延迟任务
new Thread( ) {
@Override
public void run() {
loopTask(delayRunClass);
}
}.start();
}
/**
* 无限循环实现延迟任务
*/
synchronized public static void loopTask(DelayRunClass delayRunClass) {
Long itemLong = 0L;
while (true) {
Iterator it = _TaskMap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
itemLong = (Long) entry.getValue();
// 有任务需要执行
if (Instant.now().toEpochMilli() >= itemLong) {
// 延迟任务,业务逻辑执行
System.out.println("执行任务:" + entry.getKey() +
" ,执行时间:" + LocalDateTime.now());
// 删除任务
delayRunClass.runMethod();
// CameraPojo pojo = new CameraPojo();
// pojo.setIp(ip);
// pojo.setUsername(username);
// pojo.setPassword(password);
// pojo.setChannel(channel);
// pojo.setStream(stream);
// pojo.setPushPort(pushPort);
//
// Map<String, Object> stringObjectMap = cameraController.getStringObjectMap(pojo);
// System.out.println(stringObjectMap);
_TaskMap.remove(entry.getKey());
}
}
}
}
}
public interface DelayRunClass {
public void runMethod();
}
使用
DelayTimeUtil.delayTimeExec(new DelayRunClass() {
@Override
public void runMethod() {
System.out.println("要执行的方法");
}
},"task-1", 8 );
}