Future模式,也是非常经典的设计模式,这种模式主要就利用空间换时间的概念,也就是说异步执行(需要开启一个新的线程),在互联网高并发的应用服务中,我们随处可见这种理念和代码,主要就是使用了这种模式;Future模式非常适合在处理很耗时很长的业务逻辑时进行使用,可以有效的减小系统的响应时间,提高系统的吞吐量!【吞吐量:即每秒钟可以承载的请求数量。】
/* 异步执行的任务,封装成一个对象,对象要实现Callable接口,重写call()方法,
* 在call()内写异步业务逻辑;异步调用不会阻塞主线程,主线程会继续向下执行;
* Future节省了程序的耗时,提升了应用服务的吞吐量;
*/
public class UseFuture implements Callable<String> {
private String param;
public UseFuture(String param) {
this.param = param;
}
@Override
public String call() throws Exception {
//模拟执行业务逻辑的耗时
Thread.sleep(3000);//运行耗时3秒
String result = this.param+"...处理完成!";
return result;
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
//执行查询操作
String queryStr1 = "query1";
String queryStr2 = "query2";
//使用FutureTask
FutureTask<String> future1 = new FutureTask<String>(new UseFuture(queryStr1));
FutureTask<String> future2 = new FutureTask<String>(new UseFuture(queryStr2));
//应用线程池执行
ExecutorService executorService = Executors.newFixedThreadPool(2);
/* future1和future2所包含的任务就是UseFuture;
* 调用executorService.submit()就会自动执行call()里面的具体方法,
* 执行完成后接收结果,注意此处为异步接收,即submit()为异步操作,不会阻断和
* 影响主线程,
*/
executorService.submit(future1);//异步操作
executorService.submit(future2);//异步操作
System.out.println("处理其他相关的任务...");
Thread.sleep(2000);//代表处理其他任务
/*
* 通过get()方法获取异步操作结果,提供可以设置超时时间的get方法;
* get()方法也是一个阻塞中的线程;
*/
String ret1 = future1.get();
String ret2 = future2.get();
System.out.println("数据处理完成:"+ret1);
System.out.println("数据处理完成:"+ret2);
}
}