java - 检测 Java Future 上的超时异常而不调用 get()

标签 java concurrency timeout future callable

我正在构建一个需要在 Android 上进行一些蓝牙操作的库。我想返回一个 Future 实例,因此使用我的库的任何人都可以在返回的 future 上调用 .get() ,并且可以自行处理 ExecutionException、TimeoutException 和 InterruptedException 。但是,我想自己检测超时,因为我需要一些清理逻辑,例如与设备断开连接等。我怎样才能实现这个目标?

最佳答案

您可以围绕 Future 实现一个包装类它委托(delegate)给另一个(无论您目前在哪里获取 Future 返回的那个)。像这样的东西:

final class DelegatingFuture<T> implements Future<T> {

    private final Future<T> delegate;

    DelegatingFuture(final Future<T> delegate) {
        this.delegate = Objects.requireNonNull(delegate);
    }

    // All other methods simply delegate to 'delegate'
    @Override
    public T get() 
            throws InterruptedException, ExecutionException {
        try {
            return this.delegate.get();
        } catch (final Exception ex) {
            // Handle cleanup...
            throw ex;
        }
    }

    // Something similar for get(long timeout, TimeUnit unit)
}

然后简单地return new DelegatingFuture<>(currentFuture);无论您在何处分发这些内容。

关于java - 检测 Java Future 上的超时异常而不调用 get(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56956841/

相关文章:

java - android 如何从url获取数据

java - 我们如何从列表对象中以相反的顺序获取对象?

java - 您在 Java 中遇到的最常见的并发问题是什么?

linux - 从 'timeout' 到 'wc -l' 的管道输出失败

java - 在 Maven 构建中使用 Eclipse Java Compiler (ecj)

java - 如何对这个 Map<String, List<class>> 进行排序

java - 没有 happens-before 的安全发布?除了 final 还有什么?

sql - 如何替换 Postgres 中的表?

.net - "Watch Dog"或 c# 中的沙箱系统

sql - 从VB.net调用存储过程超时错误