java - Futures.addCallback 如何保证回调在执行 future 任务的线程中执行?

标签 java concurrency guava

代码如下所示:

final ListeningExecutorService executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(4));

final Callable<String> asyncTask = new Callable<String>() {
    @Override
    public String call() throws Exception {
    return TestFuture.computeResult();
    }
};

final int listSize = 10;

final List<ListenableFuture<String>> listenableFutures = Lists.newArrayListWithExpectedSize(listSize);
for (int i = 0; i < listSize; i++) {
    listenableFutures.add(executor.submit(asyncTask));
}

for (final ListenableFuture<String> listenableFuture2 : listenableFutures) {
    Futures.addCallback(listenableFuture2, new FutureCallback<String>() {
    @Override
    public void onSuccess(final String result) {
        System.out.println("callback success with " + result + " at " + Thread.currentThread().getName());
    }

    @Override
    public void onFailure(final Throwable thrown) {
        System.out.println("callback failed with " + thrown.getMessage());
    }
    });
}

我无法弄清楚如何安排回调在将执行asyncTask的线程上执行?

我可以看到 Futures.addCallback 调用 addCallback(future, callback, MoreExecutors.sameThreadExecutor());,但我不知道 MoreExecutors.sameThreadExecutor 如何保证这一点?

最佳答案

sameThreadExecutor() 仅执行内联传递给其 execute(Runnable) 方法的任何 Runnable:也就是说,它仅调用 run() 就可以了。它根本不做任何与线程相关的事情。并且回调 Runnable 会被传递到执行 asyncTask 的同一线程上与其关联的 Executor,因为 ListeningExecutorService有效地将您的 asyncTask 包装在 FutureTask 中当其 done() 方法被调用时调用所有回调。

注意:实际上并不能保证所有回调都将在执行 asyncTask 的线程上执行。例如,如果您在 asyncTask 完成后添加回调,它将在您添加回调的线程上执行(假设您不提供回调)除了要使用的回调的 sameThreadExecutor() 之外的 Executor)。

关于java - Futures.addCallback 如何保证回调在执行 future 任务的线程中执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32863800/

相关文章:

java - 我使用 FileHandler 创建了一个记录器类将日志写入文件,但它仅打印到控制台

java - 如何在 java 中创建一个保留方法参数注释的动态代理?

java - 图像渲染在框架之外?

ios - 序列化 NSURLConnection 请求 (iOS) - 使用同步请求?

java - 按值对 AtomicLongMap 进行排序

java - 了解应用程序如何从服务器提取数据,以便可以从 web 应用程序或其他应用程序完成相同的请求

java - 如何从quickfixj中的重复组中获取值(value)

c# - 并发处理所需的设计思想

java - Java 中具有 Long 或 AtomicLong 值的多键映射

java - 具有泛型类型的哈希码