JAVA实现异步任务

业务场景

         当接收到一个接口请求时,需要将设备的广播信号进行打开,然后再规定的时间后,发送停止信号,将广播停止。这个时候不想通过定时器定时反复查询广播有没有关闭,太占用资源,所以想通过延时一定时间后,执行停止接口,但是又不能让后续逻辑堵塞。

处理方法

 

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java线程池可以很好地管理和调度多线程任务实现异步任务。以下是一个简单的示例,演示如何使用Java线程池实现异步任务: ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class AsyncTasks { private ExecutorService executorService = Executors.newFixedThreadPool(10); public void runAsyncTask(Runnable task) { executorService.execute(task); } } ``` 在上面的代码中,我们创建了一个名为`AsyncTasks`的类,该类具有一个`ExecutorService`对象,用于管理我们的线程池。我们还定义了一个`runAsyncTask`方法,该方法接受一个`Runnable`对象作为参数,并将其提交给线程池进行异步执行。 要使用这个类,我们可以创建一个新的异步任务并将其传递给`runAsyncTask`方法。例如: ```java public class Main { public static void main(String[] args) { AsyncTasks asyncTasks = new AsyncTasks(); // 创建一个新的异步任务 Runnable task = new Runnable() { @Override public void run() { // 执行异步任务 System.out.println("Async task is running."); } }; // 提交异步任务到线程池 asyncTasks.runAsyncTask(task); } } ``` 在这个例子中,我们首先创建了一个`AsyncTasks`对象,然后创建了一个新的`Runnable`对象,该对象包含了我们想要在异步任务中执行的代码。最后,我们将这个`Runnable`对象传递给`runAsyncTask`方法,该方法将任务提交给线程池进行异步执行。 使用Java线程池实现异步任务可以提高程序的并发性和响应性,并且可以有效地管理和调度多线程任务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值