zoukankan      html  css  js  c++  java
  • 【并发编程】Future和FutureTask以及CompletionService

    Future接口

    2016-04-25_161027.png
    此接口主要用于:
    • 代表异步计算的执行结果;
    • 用于可取消的task;(比使用interrupt实现取消要方便 )

    2.png

    FutureTask类

    FutureTask是Future的一个实现类;类图层次结构如下:
    Future.png


    FutureTask任务的创建--通过构造函数

    在java的并发模型中,表示Task的类主要有如下几个(其中Callable和Runnable是最基本的):
    • Callable;
    • Runnable;
    • Future;

    runnable.png

    call.png
    其中Callable和Runnable接口的主要区别在于:
    • Callable可以有返回值,且可以抛出异常;
    • Runnable没有返回值,且不抛出异常;

    FutureTask任务的创建,可以通过Callable和Runnable两个任务类进行创建,即对Callable和Runnable进行封装,见下面的构造函数:

    q2.pngq.png

    get():过去异步计算的结果

    (有时间待完善。。。)



    done():异步计算完成后调用的回调函数 ==>CompletionService

    可在FutureTask子类中实现该方法,以实现一些额外的功能,如:
    121.png

    Java类库中,有一个类的功能,就是基于此done()方法来实现的,
    该类中包括两个重要的属性:
    • Executor;==>用于提交任务使用
    • BlockingQueue; ==>当任务完成后,会将task对应的Future保存起来;
    ExeCompletionService.png

    具体实现步骤如下:
    Callable或Runnable任务 ===> RunnableFuture ===> QueueingFuture
    1.newTaskFor(): 将Callable和Runnable任务封装为:RunnableFuture
    ww.png

    2. 使用FutureTask的done():提交task到BlockingQueue ==>实现“生产者-消费者
    q1.png

    3.  使用executor来提交任务;
    ee.png

    通过上面3个步骤,一个Callable或Runnable任务在执行完成后,都会被添加到BlockingQueue中,此时就可以实现生产者和消费者模式;
    22.png


    有时间补充。。。。












    附件列表

  • 相关阅读:
    深入浅出接口测试原理及步骤
    软件测试所需要掌握的技能
    Spring Boot(三)—— 自动装配原理
    Spring Boot(一)—— Spring Boot入门
    线程的六种状态
    有关于java中List.add方法进行添加元素,发生覆盖的问题
    《暗时间》读后感
    《基于UML的高校教务管理系统的设计与实现 》论文笔记(六)
    win7下硬盘安装ubuntu
    词频统计
  • 原文地址:https://www.cnblogs.com/ssslinppp/p/5431682.html
Copyright © 2011-2022 走看看