• 【并发编程】Executor架构介绍





    Executor.jpg

    要点总结

    Executor表示的任务类型

    主要有3种:
    1. Runnable: 无返回值,无异常抛出;
    2. Callable:有返回值,可以异常抛出;
    3. Future任务: 表示异步计算,可取消; 通过newTaskFor()方法,将Runnable/Callable任务转换为Future任务;







    由上面可知: FutureTask既是Runnable任务,也是Future任务;





    Future任务的创建方法

    Future任务的特点:
    1. 异步计算:通过get()方法来获取异步计算的结果;
    2. 可取消;


    创建Future任务
    主要有2种方式:
    1. 通过FutureTask构造函数来创建;(事实上,FutureTask是Future接口的唯一实现)
    2. 通过ExecutorService的submit()方法来创建;

    • 方式1:通过FutureTask的构造函数来创建;

    • 方式2:通过ExecutorService的submit()方法来创建;

    由上面可知:ExecutorService.submit()最终还是使用FutureTask构造函数来创建Future任务;

    Executor框架,任务提交的2种方式

    1. Executor接口:executor(Runnable command);
    2. ExecutorService.submit(xxx): 是对Executor接口提交任务的扩充;

    • 方式1:

    • 方式2:





    ExecutorService接口

    ExecutorService接口是对Executor接口的扩展,主要增加了如下方法:
    1. 生命周期管理方法;
    2. 提交任务的简便方法;

    shutdown()和shutdownNow()比较

    1. shutdown():平缓关闭,不会接收新任务的提交,会等待已提交任务全部执行完;
    2. shutdownNow():粗暴关闭,不会接收新任务的提交,尝试取消正在运行的任务,返回已提交但尚未运行的任务列表;



    批量任务:invokeAll()/invokeAny()


    方法说明





    invokeAll()实现原理




    CompletionService接口

    具体实现类: ExecutorCompletionService
    • 用于提交批量异步任务,并获取结果;
    • 用于将批量异步任务的生产和消费进行解耦;

    方法介绍

    使用示例


    实现原理

    • Executor: ExecutorCompletionService委托Executor来执行任务提交操作;
    • BlockingQueue: 委托BlockingQueue来保存计算结果;



    步骤1:提交任务
    1. 将提交的任务封装为QueueingFuture;
    2. 委托Executor进行任务提交;

    步骤2: 重写done()方法
    1. 重写FutureTask的done()方法,当Future任务执行完成后,调用done(),将Future任务添加到BlockingQueue中;

    步骤3:
    1. 委托BlockingQueue实现获取任务的同步;

    CompletionService接口和ExecutorService.invokeAll()比较

    相同点:
    都可以进行批量任务提交与处理;

    不同点:
    ExecutorService.invokeAll():
    1. 每次提交1组任务,返回时,也是返回1组任务(Future);
    2. 必须等待所有任务执行完,才会返回结果,返回的任务列表与提交的任务列表顺序相同

    CompletionService接口:
    1. 每次提交1个任务,任务执行完成后,会将任务放到BlockingQueue中;
    2. BlockingQueue中存放的任务顺序,与提交的任务顺序很可能不同,哪个任务先执行完,就先放入哪个任务;
    3. 不必等待所有任务执行完;





























    ThreadPoolExecutor.png


    配置ThreadPoolExecutor






































    附件列表

    • 相关阅读:
      回发或回调参数无效。 问题的解决和思考
      母板页中的引用的图片,JS,css等路径问题
      Solution: 题解 CF1196E Connected Component on a Chessboard
      01/05/2020 我注册了博客园 I enrolled in Cnblogs.
      Basic Thought / Data Structure: 前缀和 Prefix Sum
      Basic Thought / Data Structure: 差分 Difference
      DotNet中异步编程(APM)的研究1异步编程介绍
      关于atl server 的感受(3) 一个我自以为豪的应用
      自己的博客,竟然要自己搜出来,太久没来了。
      关于atl server 的感受(2)
    • 原文地址:https://www.cnblogs.com/ssslinppp/p/5424988.html
    Copyright © 2020-2023  润新知