代码如下所示:
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/