zoukankan      html  css  js  c++  java
  • JUC-12.5-Future 和 FutureTask

    Future 是一个接口 表示异步计算的结果。它提供了检查计算是否完成的方法   和  等待计算的完成,并获取计算的结果的方法。

     

    Future的主要方法

    get(); 等待任务中计算完成 并抛出了异常 获得结果     

    isDone(); 查询任务是否完成 

     

    下面的例子中submit执行了一个Callable类型的任务然后得到了Futuer类型的结果result。

    // 新建一个Callable任务 
            Callable<Integer> callableTask = new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    System.out.println("--->开始执行任务 计算1+1");
                    TimeUnit.SECONDS.sleep(2);// 休眠2秒
                    return 2;
                }
            };
            ExecutorService executor = Executors.newCachedThreadPool();
            Future<Integer> result = executor.submit(callableTask);
            executor.shutdown();
            while (!result.isDone()) {// isDone()方法可以查询子线程是否做完
                System.out.println("子线程正在执行");
                TimeUnit.SECONDS.sleep(1);// 休眠1秒
            }
            try {
                System.out.println("子线程执行结果:" + result.get());
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }

    结果

     FutureTask类是 Future 接口的一个实现   

            FutureTask类实现了RunableFuture接口 ,RunnableFuture又继承了Runnable接口和Future接口

     

    FutureTask 可以作为Runnable被线程执行

                     也可以Future得到传入Callable对象的结果

    FutureTask<Integer> futureTask = new FutureTask<>(new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    System.out.println("futureTask 开始执行计算 1+1");
                    return 2;
                }
            });
            Thread t1 = new Thread(futureTask);// 1.可以作为Runnable类型对象使用
            t1.start();
            try {
                System.out.println(futureTask.get());// 2.可以作为Future类型对象得到线程运算返回值
            } catch (ExecutionException e) {
                e.printStackTrace();
    }

    结果

    可以看出FutureTask可以当作一个有返回值的Runnable任务来用。

    分析:FutureTask<Integer> futureTask = new FutureTask<>(new Callable...)相当于把Callable任务转换为Runnable任务,就可以使用线程来执行该任务。而futureTask.get()相当于将Callable转化为Future,从而得到异步运算的结果。

    ExecutorService执行器除了接收Runnable与Callable类型的入参,也可以接收FutureTask类型,

     

    FutureTask<Integer> futureTask = new FutureTask<>(new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    System.out.println("futureTask 计算 1+1");
                    TimeUnit.SECONDS.sleep(2);
                    return 2;
                }
            });
            ExecutorService executor = Executors.newCachedThreadPool();
            executor.submit(futureTask);// 也可以使用execute,证明其是一个Runnable类型对象
            executor.shutdown();
            while (!futureTask.isDone()) {
                System.out.println("子线程还没做完,我再睡会");
                TimeUnit.SECONDS.sleep(1);
            }
            try {
                System.out.println("子线程运行的结果:" + futureTask.get());
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }

     

    结果

     转自:https://www.cnblogs.com/zhrb/p/6372799.html

     

    古人学问无遗力,少壮工夫老始成。 纸上得来终觉浅,绝知此事要躬行。
  • 相关阅读:
    存储过程output String[1]: Size 属性具有无效大小值0
    深入理解JS异步编程四(HTML5 Web Worker)
    深入理解JS异步编程三(promise)
    深入理解JS异步编程二(分布式事件)
    深入理解JS异步编程(一)
    不定高多行溢出文本省略
    深入解析js中基本数据类型与引用类型,函数参数传递的区别
    javascript的replace+正则 实现ES6的字符串模版
    从输入网址到显示网页的全过程分析
    WebStorage 和 Cookie的区别
  • 原文地址:https://www.cnblogs.com/wf-zhang/p/12093047.html
Copyright © 2011-2022 走看看