这几天在看公司的BinLogRelover的时候, 看到大佬在WIKI里面特意指出,为何使用Guava提供的ListenableFuture来做一些回调功能, 而且还指出在高并发的场景下Java8提供的CompletableFuture
并不如人意,其实我个人还是比较喜欢CompletableFuture
的, 哈哈, 可能是以前写代码用的比较多吧。
ListenableFuture
用的不是很多, 所以优缺点也说不清楚, 但是CompletableFuture
经常让人诟病的大概包含两点吧,
- cancel(true)
大家使用CompletableFuture
肯定都是想使用他的异步编排能力,但是CompletableFuture在实现Future接口的同事,却做了一些改变, 例如cancel()方法,一不小心就会踩坑。 在FutureTask中,cancel()会根据参数选择是否中断执行线程, 这一点在一些框架代码中经常会用到,
public boolean cancel(boolean mayInterruptIfRunning) {
if (!(state == NEW &&
UNSAFE.compareAndSwapInt(this, stateOffset, NEW,
mayInterruptIfRunning ? INTERRUPTING : CANCELLED)))
return false;
try {
// in case call to interrupt throws exception
if (mayInterruptIfRunning) {
try {
Thread t = runner;
if (t != null)
t