CompletableFuture异步执行

CompletableFuture异步执行

概念

Java 8引入了一个强大的类:CompletableFuture,它在java.util.concurrent包中。CompletableFuture是Future的增强版本,主要用于实现异步编程。

首先,我们要理解什么是Future。Future是Java5引入的一个接口,代表一个异步计算的结果。你可以启动一个计算,获取一个Future对象,然后在计算完成后,通过这个Future对象来获取结果。但Future的功能有限,就是它缺乏机制处理Future的完成事件,我们只能通过Future.get()方法阻塞当前线程来获取结果,这是非常低效的。简单来说,就是使用Future的时候,当执行异步线程的时候,主线程会发生阻塞状态,不能干别的事情。而CompletableFuture是Future的增强版本,就是的当异步线程没有执行完的时候,主线程仍然可以执行其它东西。

使用案例

如下图:
在这里插入图片描述
代码如下:

public class Test1 {
    public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("异步执行的线程名字:" + Thread.currentThread().getName());
            return "Task result";
        });

        System.out.println("做其他事情......" + "当前线程:" + Thread.currentThread().getName());

        String result2 = future.get(2000, TimeUnit.MILLISECONDS);
        System.out.println("Result: " + result2 + " 当前线程" + Thread.currentThread().getName());

        String result = future.join();
        System.out.println("Result: " + result + " 当前线程" + Thread.currentThread().getName());


    }
}

执行结果如下图:
在这里插入图片描述

上面可以看出我们使用的是supplyAsync异步线程方法,它是有返回值的;还有一个没有返回值的方法,如下图:
在这里插入图片描述
使用案例如下图:
在这里插入图片描述

CompletableFuture的complete方法

CompletableFuture类中的complete()方法用于手动完成一个异步任务,并设置其结果。通过调用complete()方法,可以将一个特定的结果设置到CompletableFuture对象中,然后任何等待该异步任务的操作都会得到这个预先设置的结果。如下图:
在这里插入图片描述
看下返回结果,如下图:
在这里插入图片描述
和预期的结果一样,异步线程里面的代码根本就没有本执行到,因为在异步线程还睡眠的时候,我们就已经给异步线程CompletableFuture调用了complete方法,这个时候异步线程就相当于执行完成了,并且返回complete方法的参数值。

工作场景

那获取角色随机名字脚本举例,它里面是先生成一个CompletableFuture线程,如下图:
在这里插入图片描述
看一下getFuture方法的内容,如下图:
在这里插入图片描述
现在这个唯一性id就表示一个异步线程CompletableFuture。

然后给服务器发送一个KmlSyncDataAskNotice通知,同时把用到的异步线程对应的futureId传输过去,如下图:
在这里插入图片描述
在这里插入图片描述
最后会到scene服,如下图:
在这里插入图片描述
看下futureCompleted方法,如下图:
在这里插入图片描述
在这里插入图片描述

最美视角:记住CompletableFuture异步线程在scene服就行了,会先通过askNotice把futureId也就是scene里面对应的异步线程的标志发送给server服,server服获取数据之后,把data和futureId再通过answnerNotice发送给scene服,这样scene服才能通过futureId找到对应的CompletableFuture异步线程,然后调用它的complete方法完成就行了。最后在我们的脚本命令中取出异步线程CompletableFuture中的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用`CompletableFuture`可以方便地实现异步执行多个任务,并在所有任务完成后进行处理。下面是一个示例代码: ```java import java.util.concurrent.CompletableFuture; public class CompletableFutureExample { public static void main(String[] args) { // 创建多个CompletableFuture对象 CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> "Task 1"); CompletableFuture<String> task2 = CompletableFuture.supplyAsync(() -> "Task 2"); CompletableFuture<String> task3 = CompletableFuture.supplyAsync(() -> "Task 3"); // 执行所有任务并等待完成 CompletableFuture<Void> allTasks = CompletableFuture.allOf(task1, task2, task3); // 在所有任务完成后进行处理 allTasks.thenRun(() -> { try { // 获取任务的结果 String result1 = task1.get(); String result2 = task2.get(); String result3 = task3.get(); System.out.println("Task 1 result: " + result1); System.out.println("Task 2 result: " + result2); System.out.println("Task 3 result: " + result3); // 继续后续的操作 // ... } catch (Exception e) { e.printStackTrace(); } }); // 等待所有任务完成 allTasks.join(); } } ``` 在上述代码中,我们创建了三个`CompletableFuture`对象:`task1`、`task2`和`task3`,它们代表了三个异步任务。然后,我们使用`CompletableFuture.allOf()`方法将这三个任务组合成一个新的`CompletableFuture`对象`allTasks`,该对象将在所有任务完成后触发。在`allTasks.thenRun()`中,我们定义了所有任务完成后的处理逻辑,包括获取每个任务的结果并进行处理。最后,我们调用`allTasks.join()`方法等待所有任务完成。 使用`CompletableFuture`可以更灵活地处理异步任务的结果和异常,还可以通过方法链的方式组合多个任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr-X~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值