1. JDK 中Future模式的基本结构如下:

JDK 中Future模式使用_第1张图片

其中Future接口相当于订单或契约,拿着她可以取到买的Mac Pro,也就是可以取到真实数据。RunnableFuture继承了Future和Runnable两个接口,其中run方法用用于构造真实数据。她有一个具体的实现FutureTask类。FutureTask会调用Callable接口完成实际的数据组装工作。

  1. JDK内置的Future基本使用

    /**
    * Created with IntelliJ IDEA.
    * User: zyg
    * Date: 2019/2/2
    * Time: 下午2:41
    * Description:使用callable实例构造一个FutureTask实例,并将其提交给线程池
    */
    public class RealData implements Callable {
    private String para;
    
    public RealData(String para) {
        this.para = para;
    }
    
    //实现Callable接口,其call方法会构造真实数据并返回
    public String call() throws Exception {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 10; i++) {
            Thread.sleep(200);
            sb.append(para);
        }
        return sb.toString();
    }
    
    public static void main(String[] args) {
        //使用Callable接口实例构造FutureTask实例
        FutureTask future = new FutureTask(new RealData("大幂幂"));
        //定义线程池
        ExecutorService exec = Executors.newFixedThreadPool(1);
        //使用现场异步处理真实数据
        exec.submit(future);
        System.out.println("请求完毕,可以接着做其他事情...");
    
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    
        //业务处理完毕,现在假设需要真实数据,使用Callbale接口的get方法,获取真实数据
        //如果真实数据还没准备好则阻塞,这个过程在模拟Future模式的时候已实现
        try {
            System.out.println("数据{}," + future.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    
        exec.shutdown();
    }
    }