这几天有了解到Guava的LinsteningExecutorService可以设置线程执行完成后的回调方法, 联系到我们在进行多线程编程的时候都需要去拿到这个返回值做回调,所以很感兴趣Guava是怎实现这个机制的,遂调查了一下Guava的源码。

Guava里面实现线程回调也非常简单, 核心的逻辑就是新建一个Futures.CallbackListener的线程,这个线程会通过future.get阻塞拿到线程的返回值,拿到返回值之后就调用用户设置的onSuccess方法。

如果在线程的执行过程中发生异常,则会调用用户设置的onFailure方法,将线程执行的异常信息返回给用户。

核心逻辑的源代码如下:

@Override
public void run() {
final V value;
try {
value = getDone(future);
} catch (ExecutionException e) {
callback.onFailure(e.getCause());
return;
} catch (RuntimeException | Error e) {
callback.onFailure(e);
return;
}
callback.onSuccess(value);
}

文章目录