我是靠谱客的博主 整齐白云,最近开发中收集的这篇文章主要介绍Java并发编程实战--FutureTask,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

FutureTask也可以用作闭锁。(FutureTask实现了Future语义,表示一种抽象的可生成结果的计算。FutureTask表示的计算是通过Callable来实现的,相当于一种可生成结果的Runnable,并且可以处于以下3种状态:等待运行(Waiting to run),正在运行(Running)和运行完成(Completed)。”执行完成”表示计算的所有可能结束方式,包括正常结束、由于取消而结束和由于异常而结束等。当FutureTask进入完成状态后,它会停止在这个状态上。

Future.get的行为取决于任务的状态。如果任务已经完成,那么get会立即返回结果,否则get将阻塞直到任务进入完成状态,然后返回结果或者抛出异常。FutureTask将计算结果从执行计算的线程到获取这个结果的线程,而FutureTask的规范确保了这种传递过程能实现结果的安全发布。

FutureTask在Executor框架中表示异步任务,此外还可以用来表示一些时间较长的计算,这些计算可以在使用计算结果之前启动。

public class Preloader {
    ProductInfo loadProductInfo() throws DataLoadException, InterruptedException {
        System.out.println("loadProductInfo start");
        Thread.sleep(1000 * 10);
        System.out.println("loadProductInfo end");
        return null;
    }

    private final FutureTask<ProductInfo> future =
            new FutureTask<>(() -> loadProductInfo());
    private final Thread thread = new Thread(future);

    public void start() {
        thread.start();
        System.out.println("start");
    }

    public ProductInfo get()
            throws DataLoadException, InterruptedException {
        try {
            System.out.println("get start");
            ProductInfo per = future.get();
            System.out.println("get end");
            return per;
        } catch (ExecutionException e) {
            Throwable cause = e.getCause();
            if (cause instanceof DataLoadException)
                throw (DataLoadException) cause;
            else {
               // throw LaunderThrowable.launderThrowable(cause);
                return null;
            }
        }
    }

    interface ProductInfo {
    }
}

class DataLoadException extends Exception {
}

Preloader创建了一个FutureTask,其中包含从数据库加载产品信息的任务,以及一个执行运算的线程。由于在构造函数或静态初始化方法中启动线程并不是一种好方法,因此提供了一个start方法来启动线程。当程序虽有需要ProductInfo时,可以调用get方法,如果数据已经加载,那么将返回这些数据,否则将等待加载完成后再返回。

Callable表示的任务可以抛出受检查的或未受检查的异常,并且任何代码都可能抛出一个Error。无论任务代码抛出什么异常,都会被封装到一个ExecutionException中,并在Future.get中被重新抛出。这将使调用get的代码变得复杂,因为它不仅需要处理可能出现的ExecutionException(以及未检查的CancellationException),而且还由于ExecutionException是作为一个Throwable类返回的,因此处理起来并不容易。

Preloader preloader=new Preloader();
preloader.start();
preloader.get();

输出
start
get start
loadProductInfo start
loadProductInfo end
get end

java并发编程实战pdf及案例源码下载:
http://download.csdn.net/detail/xunzaosiyecao/9851028

作者:jiankunking 出处:http://blog.csdn.net/jiankunking

最后

以上就是整齐白云为你收集整理的Java并发编程实战--FutureTask的全部内容,希望文章能够帮你解决Java并发编程实战--FutureTask所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部