概念
Future模式非常适合在处理很耗时很长的业务逻辑时进行使用,可以有效的减小系统的响应时间,提高系统的吞吐量和用户体验。
事例
这里我们来看一个小demo,解释我都加在注释里了
public class UseFuture implements Callable<String>{
private String para;
public UseFuture (String para){
this.para=para;
}
//业务逻辑,可能执行的非常慢
@Override
public String call() throws Exception {
Thread.sleep(3000);
String result=this.para+"执行成功";
return result;
}
public static void main(String[] args) {
String queryStr="query";
//构造FutureTask,并且传入需要真正进行业务逻辑处理的类,该类一定是实现了Callable接口的类
FutureTask<String> future=new FutureTask<>(new UseFuture(queryStr));
//创建一个线程数为1的固定线程
ExecutorService executor=Executors.newFixedThreadPool(1);
/*提交future,会执行call方法,这里execute和submit的区别在于:
*execute只能接受实现Runnable接口的类,
*而submit还可以接受实现Callable接口的类。
*/
executor.submit(future);
System.out.println("请求提交完毕");
try {
/*这里可以做其他业务逻辑,也就是主线程的业务逻辑
* 例如,我们在网上购物时,
* 支付后,executor.submit(futuer)线程去异步的做支付后的流程,例如数据库的操作等耗时操作
* 这里可以直接写,支付后直接显示支付成功的页面和继续购物的逻辑
* 这样做提高了用户的体验感,不用等支付后,数据库等耗时操作都执行完,我才能继续浏览其他商品
*/
System.out.println("让它自己慢慢执行,我们来做别的事情");
Thread.sleep(2000);
//调用获取数据方法,如果call()方法没有执行完成,则依然会进行等待
System.out.println("数据:" + future.get());
} catch (Exception e) {
e.printStackTrace();
}
executor.shutdown();
}
}
运行结果: