基于com.google.guava 的异步回调

导包

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>10.0.1</version>
</dependency>
package com.async.demo.controller;

import com.google.common.util.concurrent.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.*;


@RestController
@RequestMapping("/asyncDemo")
public class AsyncDemoController {

    @GetMapping("/testGuava")
    public String testGuava(){
        Callable<Boolean> callable = () -> {
            System.out.println("test guava");
            return null;
        };
        ExecutorService executor =  Executors.newFixedThreadPool(5);
        ListeningExecutorService listenableExecutorService = MoreExecutors.listeningDecorator(executor);
        ListenableFuture<Boolean> listenableFuture =  listenableExecutorService.submit(callable);
        Futures.addCallback(listenableFuture, new FutureCallback<Boolean>() {
            @Override
            public void onSuccess(Boolean aBoolean) {
                System.out.println("test ok!");
            }

            @Override
            public void onFailure(Throwable throwable) {
                System.out.println("test fail!");
            }
        }, listenableExecutorService);

        return "ok";
    }
}

参考:https://blog.youkuaiyun.com/qq_42651904/article/details/109426517

### Java异步线程回调的实现方式与最佳实践 Java 提供了多种机制来支持异步编程模型中的线程回调功能。以下是常见的几种实现方式及其特点: #### 1. **基于 `Future` 的阻塞等待** 传统的 `Future` 接口允许获取异步计算的结果,但它本身并不提供任何通知机制或回调能力。开发者通常需要通过轮询或者显式的阻塞调用来等待任务完成。 ```java ExecutorService executor = Executors.newSingleThreadExecutor(); Future<String> future = executor.submit(() -> { Thread.sleep(1000); return "Result"; }); String result = future.get(); // 阻塞当前线程直到任务完成 executor.shutdown(); ``` 这种方式虽然简单,但在实际应用中可能不够灵活,因为它会阻塞主线程[^1]。 --- #### 2. **使用 `ListenableFuture` 和 `FutureCallback` (Google Guava)** Guava 库引入了 `ListenableFuture` 接口以及配套的 `FutureCallback` 抽象类,使得开发人员可以在不阻塞的情况下注册回调函数以响应任务的状态变化。 ```java ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool()); ListenableFuture<String> future = service.submit(() -> { Thread.sleep(1000); return "Result from ListenableFuture"; }); Futures.addCallback(future, new FutureCallback<String>() { @Override public void onSuccess(@Nullable String result) { System.out.println("Success: " + result); } @Override public void onFailure(Throwable t) { t.printStackTrace(); } }, MoreExecutors.directExecutor()); service.shutdown(); ``` 这种方法显著提高了灵活性并减少了资源消耗,适合于高并发场景下的异步操作管理[^2]。 --- #### 3. **利用 `CompletableFuture` 进行链式调用** 自 JDK 8 起,`CompletableFuture` 成为了标准库的一部分,它不仅提供了更强大的 API 来构建复杂的异步工作流,还内置了对回调的支持。相比之前的解决方案,它的优势在于能够轻松组合多个异步任务,并且可以通过声明式的方式定义后续动作。 ```java CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(() -> { try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } }).thenRun(() -> System.out.println("Task completed")); // 或者带有返回值的情况 CompletableFuture<Integer> supplyAsync = CompletableFuture.supplyAsync(() -> { try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } return 42; }).handle((result, throwable) -> { if (throwable != null) { System.err.println("Error occurred"); return -1; } return result * 2; }); System.out.println(supplyAsync.join()); // 输出结果为 84 ``` 此方法特别适用于现代应用程序设计,尤其是在微服务架构下处理分布式事务时非常有用[^3]。 --- #### 4. **结合 Reactor 或 RxJava 的反应式扩展** 对于更加复杂的需求,可以考虑采用像 Project Reactor 或 RxJava 这样的反应式框架。它们都围绕观察者模式构建了一套完整的工具集用于简化事件驱动型程序的设计过程。 例如,在 Spring WebFlux 中经常使用的 Flux/Mono 类型就属于此类范畴之一: ```java Mono.fromCallable(() -> { Thread.sleep(1000L); return "Hello Reactive!"; }) .subscribeOn(Schedulers.boundedElastic()) .doOnError(error -> System.err.println("An error has been encountered")) .map(String::toUpperCase) .subscribe(System.out::println); // 手动触发订阅行为 Thread.sleep(2000L); ``` 这些高级别的抽象层进一步增强了系统的可维护性和性能表现,特别是在面对大量短生命周期请求的时候尤为明显。 --- ### 总结 每种技术都有其适用范围和局限性: - 如果只是简单的非阻塞需求,则推荐优先选用 `CompletableFuture`; - 当项目已经依赖 Google Guava 并希望保持一致性时可以选择 `ListenableFuture` 加上定制化的 `FutureCallback` 实现方案; - 对于极端负载条件下的高性能要求则应评估是否迁移到专门针对该领域优化过的第三方库上去比如 Akka Streams / Ratpack 等; 最终的选择取决于具体业务背景和技术栈现状等因素综合考量之后才能得出结论。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值