一般Future都是和Callable配合使用的。Future模式非常适合在处理耗时很长的业务逻辑时进行使用,可以有效旳减小系统的响应时间和提高系统的吞吐量。

1、下面看一下例子。


public class UserFuture implements Callable<String>{  //任务要实现Callable接口然后重写call方法
private String para;
public UserFuture(String para) {
this.para = para;
}
@Override
public String call() throws Exception {
//模拟执行耗时
Thread.sleep(1000 * new Random().nextInt(5));
return para+"处理完成!";
}

public static void main(String[] args) throws InterruptedException, ExecutionException {
FutureTask<String> future1 = new FutureTask<String>(new UserFuture("查询1"));
FutureTask<String> future2 = new FutureTask<String>(new UserFuture("查询2"));

ExecutorService pool = Executors.newFixedThreadPool(2);

Future f1 = pool.submit(future1);
Future f2 = pool.submit(future2);

//先尝试一下返回值Future的get方法,可以发现get()方法是一直阻塞着等待任务执行完再返回值
if(f1.get()==null){
System.out.println("任务1完成");
}

if(f2.get()==null){
System.out.println("任务2完成");
}
}
}


执行结果:可以发现,等执行耗时过去了,Futrue的get()方法就会获取的null,就等于任务已经执行完了。


任务1完成
任务2完成


2、提及一下线程池的两个执行任务的方法:一个是execute方法,一个是submit方法。两个的区别:submit执行的任务可以是实现Runnable接口或者Callable接口,而execute只能执行实现Runnable接口的任务。submit有返回值Future,而execute方法没有返回值。 返回值的Future值得注意的是有一个方法是get(),如果返回是null,证明任务执行完毕。



3、下面看一下FutureTask的get()方法,它和Future的get()方法也是会一直等待,直到任务执行完毕。但是它返回的是call()方法的返回值。

下面看一下例子:基本和上面的例子是一样的,就是最后调用的方法不一样而已。


public class UserFuture implements Callable<String>{
private String para;
public UserFuture(String para) {
this.para = para;
}
@Override
public String call() throws Exception {
//模拟执行耗时
Thread.sleep(1000 * new Random().nextInt(5));
return para+"处理完成!";
}

public static void main(String[] args) throws InterruptedException, ExecutionException {
FutureTask<String> future1 = new FutureTask<String>(new UserFuture("查询1"));
FutureTask<String> future2 = new FutureTask<String>(new UserFuture("查询2"));

ExecutorService pool = Executors.newFixedThreadPool(2);

Future f1 = pool.submit(future1);
Future f2 = pool.submit(future2);

System.out.println("主线程处理其他逻辑任务");
Thread.sleep(1000);

//调用获取数据的方法,如果call()方法没有执行完成,则依然会进行等待。
System.out.println(future1.get()); //获取任务1的call方法返回结果
System.out.println(future2.get()); //获取任务2的call方法返回结果

}
}


执行结果:可以发现等任务执行完毕,返回的确实是call方法的返回值。

主线程处理其他逻辑任务
查询1处理完成!
查询2处理完成!