• 17. 如何使用CompletionService?


    如何使用CompletionService

    ComPletionservice有什么用?如果你的需求是按任务完成时间,先后顺序返回执行结果,那么推荐你使用它,例如这个动画演示了

    线程池正在执行三个任务,

    任务上的数字表示他们的执行时长,时长为一秒的任务最先完成,

    其次是时长为两秒的任务,

    最后是时长为三秒的任务,

    他们完成以后,按照完成时间先后顺序返回结果,意思是123,如果你的需求也是这样的话,那么请你使用ComPletionservice, ComPletionservice是一个接口,

    它的功能刚刚也了解过,就是返回结果采用的是执行优先原则,

    先执行完先返回,它带有泛型可以指定任务结果的类型。

    它里面一共有5个方法,

    这5个方法的作用都列举在这,上面这2个submit方法用于提交任务。

    下面这三个方法用于获取任务执行结果,

    这是ComPletionservice接口唯一的实现类。


    ExecutorComPletionservice它有两个构造方法,这两个构造方法都有一个参数Executor,

    说明它依赖于线程池,除此以外它还可以指定装任务结果的队列,

    接下来编写实例代码,首先定义一个任务task,实现callable接口并指定泛型为integer,重写call方法,定义一个int类型的属性timeout,用于记录执行时间,重载构造方法用于初始化执行时间,各方法返回执行时间,在返回之前输出当前执行时间,输出完以后使当前线程的休眠,用于模拟任务执行时长,

    接下来执行该任务,首先创建一个固定大小为5的线程池,然后创建一ExecutorComPletionservice对象,并指定线程池,接收该对象,接着使用for循环,从5~1提交5个任务,创建任务并指定任务执行时长为I,接着提交任务不接收方法返回值。因为我们获取结果的地方不在这,在另一个for循环中,调用ComPletionservice的这个方法,拿到future对象,再调用future的get方法获取结果,并输出take方法和get方法有异常抛出 ,使用try---catch将其捕获,写上finally代码块,在 finally代码块中调用shoudown方法关闭线程,

    至此main方法编写完成,整个例子,也编写完成。

    执行程序,观察执行结果。 


    从执行结果来看,程序输出执行顺序
    54321,返回顺序12345,

    说明 ComPletionservice的确是按照任务完成时间先后顺序返回结果,

    总结

    最后总结一下本节内容。本节介绍了 ComPletionservice它的作用及用法,这里就不再赘述了,在实际开发中只要是遇到执行多个任务,需要按照任务完成时间先后顺序返回结果的,就可以使用 ComPletionservice来解决这些的代码。 


      

    附录:

    笔记完整文本:

    ComPletionservice有什么用?如果你的需求是按任务完成时间,先后顺序返回执行结果,那么推荐你使用它,例如这个动画演示了线程池正在执行三个任务,任务上的数字表示他们的执行时长,时长为一秒的任务最先完成,其次是时长为两秒的任务,最后是时长为三秒的任务,他们完成以后,按照完成时间先后顺序返回结果,意思是123,如果你的需求也是这样的话,那么请你使用ComPletionservice, ComPletionservice是一个接口,它的功能刚刚也了解过,就是返回结果采用的是执行优先原则,先执行完先返回,它带有泛型可以指定任务结果的类型。它里面一共有5个方法,这5个方法的作用都列举在这,上面这2个submit方法用于提交任务。下面这三个方法用于获取任务执行结果,这是ComPletionservice接口唯一的实现类。 ExecutorComPletionservice它有两个构造方法,这两个构造方法都有一个参数Executor,说明它依赖于线程池,除此以外它还可以指定装任务结果的队列,接下来编写实例代码,首先定义一个任务task,实现callable接口并指定泛型为integer,重写call方法,定义一个int类型的属性timeout,用于记录执行时间,重载构造方法用于初始化执行时间,各方法返回执行时间,在返回之前输出当前执行时间,输出完以后使当前线程的休眠,用于模拟任务执行时长,接下来执行该任务,首先创建一个固定大小为5的线程池,然后创建一ExecutorComPletionservice对象,并指定线程池,接收该对象,接着使用for循环,从5~1提交5个任务,创建任务并指定任务执行时长为I,接着提交任务不接收方法返回值。因为我们获取结果的地方不在这,在另一个for循环中,调用ComPletionservice的这个方法,拿到future对象,再调用future的get方法获取结果,并输出take方法和get方法有异常抛出 ,使用try---catch将其捕获,写上finally代码块,在 finally代码块中调用shoudown方法关闭线程,至此main方法编写完成,整个例子,也编写完成。执行程序,观察执行结果。 从执行结果来看,程序输出执行顺序54321,返回顺序12345,说明 ComPletionservice的确是按照任务完成时间先后顺序返回结果,最后总结一下本节内容。本节介绍了 ComPletionservice它的作用及用法,这里就不再赘述了,在实际开发中只要是遇到执行多个任务,需要按照任务完成时间先后顺序返回结果的,就可以使用 ComPletionservice来解决这些的代码。

     

  • 相关阅读:
    jquery 中的 map each has
    jquery的 dom操作
    jquery的 包装集
    JQuery 的了解之 选择器
    JS 中闭包的变量 闭包与this
    IPhone下json的解析 NSJSONSerialization
    IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决办法
    win7系统的用户去掉用户账户控制 提升管理员
    移动开发在路上-- IOS移动开发系列 多线程三
    MVC 入门 自动生成 增删改查所有功能
  • 原文地址:https://www.cnblogs.com/cj8357475/p/16032850.html
Copyright © 2020-2023  润新知