业务场景
当接收到一个接口请求时,需要将设备的广播信号进行打开,然后再规定的时间后,发送停止信号,将广播停止。这个时候不想通过定时器定时反复查询广播有没有关闭,太占用资源,所以想通过延时一定时间后,执行停止接口,但是又不能让后续逻辑堵塞。
处理方法
AlarmOutStatus outStatus = new AlarmOutStatus();
outStatus.setChannelIndexCode(id);
outStatus.setStatus("1");
HikRootData<AlarmOutStatus> alarmOutStatusHikRootData = AlarmOutHttpClient.setStatus(outStatus);
if (alarmOutStatusHikRootData != null) {
if ("0".equals(alarmOutStatusHikRootData.getCode())) {
addYjIpCache(id);
System.out.println(ip + ":干冰排放区域预警广播已经打开");
// 创建一个异步任务
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
// 这里是你要异步执行的代码
System.out.println("Async task started");
System.out.println("音柱id:"+id);
try {
Thread.sleep(6*60*1000); // 模拟耗时操作
queryYjIpExpires(id, (Object id1) -> {
AlarmOutStatus outStatus1 = new AlarmOutStatus();
outStatus1.setChannelIndexCode(id1+"");
outStatus1.setStatus("0");
HikRootData<AlarmOutStatus> alarmOutStatusHikRootData1 = AlarmOutHttpClient.setStatus(outStatus1);
if (alarmOutStatusHikRootData1 != null) {
if ("0".equals(alarmOutStatusHikRootData1.getCode())) {
System.out.println(id1 + ":干冰排放区域预警广播已经关闭");
}
}
return null;
});
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Async task finished");
});
}
}
其中主要是
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {});执行异步
System.out.println("11111");
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
// 这里是你要异步执行的代码
System.out.println("Async task started");
try {
System.out.println("22222");
Thread.sleep(2000); // 模拟耗时操作
System.out.println("44444");
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Async task finished");
});
System.out.println("3333");
这个执行顺序就是
11111
3333
22222
44444