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

 

古人学问无遗力,少壮工夫老始成。 纸上得来终觉浅,绝知此事要躬行。
原文地址:https://www.cnblogs.com/wf-zhang/p/12093047.html