美文网首页
Future模式

Future模式

作者: 12点前睡觉hhh | 来源:发表于2019-06-02 18:49 被阅读0次

    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);//取得返回对象,可以设置超时时常
    

    相关文章

      网友评论

          本文标题:Future模式

          本文链接:https://www.haomeiwen.com/subject/vvaxxctx.html