future是java1.5引入的interface,可以方便的用于异步结果的获取。
常见的应用比如像一些调用http接口不能及时返回数据这样代码形成阻塞,而引入future模式
可以先调用http接口,然后获得futrue实例(相当于票据) 去干其他事情,这样提高了代码效率;
下面就简单介绍下future的简单使用;
1 Future的主要方法
get()方法可以当任务结束后返回一个结果,如果调用时,工作还没有结束,则会阻塞线程,直到任务执行完毕
get(long timeout,TimeUnit unit)做多等待timeout的时间就会返回结果
cancel(boolean mayInterruptIfRunning)方法可以用来停止一个任务,如果任务可以停止(通过mayInterruptIfRunning来进行判断),则可以返回true,如果任务已经完成或者已经停止,或者这个任务无法停止,则会返回false.
isDone()方法判断当前方法是否完成
isCancel()方法判断当前方法是否取消
2 Future的实例
import com.google.common.collect.Lists;
import com.taobao.api.internal.toplink.logging.LogUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import java.util.List;
import java.util.concurrent.*;
@Slf4j
public class TestFuture {
// 创建一个10个核心线程池
private static ExecutorService executor = Executors.newFixedThreadPool(10);
public static void main(String[] args) {
List<Future<Integer>> list = Lists.newArrayList();
for (int i = 0; i < 20; i++) {
int finalI = i;
//lambda调用私有方法
Future<Integer> future = executor.submit(() -> {
return doWork(finalI);
});
list.add(future);
}
list.stream().forEach(integerFuture -> {
try {
//防止方法长时间没有返回,拖垮系统,设置超时4S
System.out.println(integerFuture.get(4, TimeUnit.SECONDS));
;
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
});
}
/**
* 工作方法
* @param i
* @return
*/
@SneakyThrows
private static int doWork(int i) {
log.info("doWork: {}", i);
Thread.sleep(1000);
return i;
}
}
执行结果
所以 ,当我们项目中用些批量操作 ,调用接口 ,或者批量更新或者插入 需要知道返回结果的时候future可以很友好的满足我们的需求。