Future模式是java多线程开发的一种常用模式,它的核心思想是*异步调用
Future模式类似在网上买东西。比如你在淘宝下单买了一步手机,当我们支付完成以后,手机没有办法立即送到家里,但是在电脑上会产生一个订单。这个订单就是将来发货或者领取手机的重要凭证,这个凭证也就是Future模式会给出一个契约。支付结束以后,你就可以想干嘛干嘛,这个订单就成了商家配货,发货的驱动力。当然这一切你都不用担心,你要做的就是快递送货时,收货就好了。
对于Future模式来说,虽然它无法立即给你需要的数据,但是它会返回一个契约,将来你凭借这个契约取重新获取你需要的信息即可。
1.JDK中的Future模式
Future接口类似于前文面熟的订单或者说是契约。其中Future接口类似于前文描述的契约。通过它可以得到线程执行完之后的数据。RunnableFuture继承了Future和Runnable接口,它有一个具体的实现类FutureTask类。Future类有一个内部类Sync,一些实质性的工作会委托Sync类实现,而Sync类最终会调用Callable接口,完成实际数据的组装工作。
Callable接口只有一个call方法,它会返回需要构造的数据。
一个简单的Future使用实例。
public class RealData implements Callable<String> {
private String data;
public RealData(String data){
this.data=data;
}
@Override
public String call() throws Exception {
StringBuffer sb=new StringBuffer();
for (int i=0;i<10;i++){
sb.append(data);
Thread.sleep(100);
}
return sb.toString();
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> future = new FutureTask<>(new RealData("h"));
ExecutorService es = Executors.newSingleThreadExecutor();
es.submit(future);
System.out.println("请求完毕");
try{
//进行其他操作,这里使用sleep模拟其他业务操作
Thread.sleep(2000);
}catch (InterruptedException e){
}
//使用future.get得到返回结果,如果call方法还没执行完,那么将等待。
System.out.println("数据:"+future.get());
}
}
除了基本功能外,JDK还为future接口提供了一些简单的控制功能。
boolean cancel(boolean mayInterruptIfRunning) ; //取消任务
boolean iscancelled();//是否已经取消
boolead isDone();//是否已经完成
V get() ;//取得返回对象
V get(Long timeout,TimeUnit unit);//取得返回对象,可以设置超时时常
网友评论