首页 > 解决方案 > 在不调用 get() 的情况下检测 Java Future 上的超时异常

问题描述

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

标签: javaconcurrencytimeoutfuturecallable

解决方案


您可以实现一个包装器类,围绕Future该包装器类委托给一个不同的类(由您目前获得的任何地方返回的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);只要你把这些分发出去。


推荐阅读