java - 使用阻塞 API 时的 Java 异步编程

标签 java asynchronous futuretask

<分区>

我正在开发一个使用某些阻塞 API 的 Java 项目。

我想使用异步编程和回调,这样我就不必在等待结果时阻塞。我研究过使用 Java Future,但我认为我可以使用它的唯一方法是调用将阻塞的 get() 方法。我也愿意使用其他方式进行异步编程。

我当前的代码如下所示。

Object res = blockingAPI();
sendToClient(res);

如果我要使用 Future,我会这样做。但我的理解是 get() 是阻塞的。

private final int THREADS = Runtime.getRuntime().availableProcessors();
private ExecutorService executor = Executors.newFixedThreadPool(THREADS);

public void invokeApi() {
    Future<Object> future = executor.submit(new Callable<Object>() {
        public Object call() {
            return result;
        }
    });

    Object result = future.get(5, TimeUnit.SECONDS)
}

我如何实现这一点,以便 get() 的功能基本上由回调处理,当结果可用时自动调用该回调?

最佳答案

几个选项。

一个是将你的 future 包装到 CompletableFuture 中:

public static <T> CompletableFuture<T> makeCompletableFuture(Future<T> future) {
    return CompletableFuture.supplyAsync(() -> {
        try {
            return future.get();
        } catch (InterruptedException|ExecutionException e) {
            throw new RuntimeException(e);
        }
    });
}

另一种是使用 Guava ListenableFuture :

ListeningExecutorService service = MoreExecutors.listeningDecorator(executor);
ListenableFuture<T> future = service.submit(callable);
Futures.addCallback(future, new FutureCallback<T>() {
    public void onSuccess(T t) {
        // ...
    }
    public void onFailure(Throwable thrown) {
        // ...
    }
});

您还可以使用 Akka Futures这是高度可组合的。

关于java - 使用阻塞 API 时的 Java 异步编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31169528/

相关文章:

java - 如何使用 Selenium 和 Java 识别 <a> 中的文本

node.js - 异步函数完成后如何发送json

rest - 带有 Location header 的 JAX-RS AsyncResponse.resume()

javascript - 在未来几天或几个月内执行操作

java - 将信任链导入 key 对或将其导入 keystore 或两者

java - 为什么我的方法不返回任何内容?

从数据库获取时Java流按行分组

multithreading - 并发、并行和异步方法有什么区别?

java - Future.cancel(boolean) 方法的实用程序

java - 如何终止多线程中超时的任务?