当前位置: 首页 > news >正文

并发编程工具集——Future(二十七)

简介:

  1. 创建完线程池,该如何使用
  2. 获取任务的执行结果(execute() 方法没有返回值)。

如何获取任务执行结果

  1. Java 通过 ThreadPoolExecutor 提供的 3 个 submit() 方法和 1 个 FutureTask 工具类来支持获得任务执行结果的需求。三个submit()以及区别如下区别:
  2. 提交 Runnable 任务 submit(Runnable task) :这个方法的参数是一个 Runnable 接口,Runnable 接口的 run() 方法是没有返回值的,所以 submit(Runnable task) 这个方法返回的 Future 仅可以用来断言任务已经结束了,类似于 Thread.join()。
  3. 提交 Callable 任务 submit(Callable<T> task):这个方法的参数是一个 Callable 接口,它只有一个 call() 方法,并且这个方法是有返回值的,所以这个方法返回的 Future 对象可以通过调用其 get() 方法来获取任务的执行结果。
  4. 提交 Runnable 任务及结果引用 submit(Runnable task, T result):
    • 这个方法很有意思,假设这个方法返回的 Future 对象是 f,f.get() 的返回值就是传给 submit() 方法的参数 result。
    • 关于它的经典用法。需要注意的是 Runnable 接口的实现类 Task 声明了一个有参构造函数 Task(Result r) ,创建 Task 对象的时候传入了 result 对象,这样就能在类 Task 的 run() 方法中对 result 进行各种操作了。result 相当于主线程和子线程之间的桥梁,通过它主子线程可以共享数据。
  5. 它们的返回值都是 Future 接口,Future 接口有 5 个方法,取消任务的方法 cancel()、判断任务是否已取消的方法 isCancelled()、判断任务是否已结束的方法 isDone()以及2 个获得任务执行结果的 get() 和 get(timeout, unit),其中最后一个 get(timeout, unit) 支持超时机制。
  6. 通过 Future 接口的这 5 个方法发现,我们提交的任务不但能够获取任务执行结果,还可以取消任务。不过需要注意的是:这两个 get() 方法都是阻塞式的,如果被调用的时候,任务还没有执行完,那么调用 get() 方法的线程会阻塞,直到任务执行完才会被唤醒。(此时阻塞的不是调用的线程,而是主线程)

  7. FutureTask 工具类:
    • 该类有两个构造函数,参数和前面的 submit() 方法类似

    • 如何使用:FutureTask 实现了 Runnable 和 Future 接口,由于实现了 Runnable 接口,所以可以将 FutureTask 对象作为任务提交给 ThreadPoolExecutor 去执行,也可以直接被 Thread 执行;又因为实现了 Future 接口,所以也能用来获得任务的执行结果。下面的示例代码是将 FutureTask 对象提交给 ThreadPoolExecutor 去执行。

    • FutureTask 对象直接被 Thread 执行的示例代码如下所示。利用 FutureTask 对象可以很容易获取子线程的执行结果。

补充

  1. 利用 Java 并发包提供的 Future 可以很容易获得异步任务的执行结果,无论异步任务是通过线程池 ThreadPoolExecutor 执行的,还是通过手工创建子线程来执行的。
  2. 利用多线程可以快速将一些串行的任务并行化,从而提高性能;如果任务之间有依赖关系,比如当前任务依赖前一个任务的执行结果,这种问题基本上都可以用 Future 来解决。

 

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【CPS出版】2024年智能计算与数据分析国际学术会议(ICDA 2024,9月6日-8)
  • 压缩技巧:word怎么压缩到10m以下?word压缩,快速学会的5个高效方法!
  • vue el-input 输入框下拉显示匹配数据
  • 一文带你掌握C++异常处理
  • FPGA开发——数码管的使用(二)
  • 敏捷开发笔记(第14章节)--TEMPLATE METHOD模式和STRATEGY模式:继承与委托
  • 【第四节】python面向对象
  • 基于 LangChain 开发应用程序第七章-代理
  • 781页 | 2024全国数据资产政策法规汇编(可下载)
  • 富唯智能转运机器人:高效、智能、未来的选择
  • 代码随想录算法训练营第二十六天|452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间
  • 11部门公布第二批国家数字乡村试点地区名单
  • uniapp微信小程序本地和真机调试文件图片上传成功但体验版不成功
  • K8S Service-NodePort:固定端口
  • 数据化项目中如何优化数据分析报表的响应速度
  • $translatePartialLoader加载失败及解决方式
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【mysql】环境安装、服务启动、密码设置
  • 【译】理解JavaScript:new 关键字
  • Akka系列(七):Actor持久化之Akka persistence
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Date型的使用
  • es6要点
  • es的写入过程
  • gf框架之分页模块(五) - 自定义分页
  • Git初体验
  • java概述
  • Java精华积累:初学者都应该搞懂的问题
  • markdown编辑器简评
  • MYSQL 的 IF 函数
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • React系列之 Redux 架构模式
  • Redis 中的布隆过滤器
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Vue2.0 实现互斥
  • win10下安装mysql5.7
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 讲清楚之javascript作用域
  • 批量截取pdf文件
  • 七牛云假注销小指南
  • 前端工程化(Gulp、Webpack)-webpack
  • 前嗅ForeSpider教程:创建模板
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 世界上最简单的无等待算法(getAndIncrement)
  • 协程
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 一份游戏开发学习路线
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 正则与JS中的正则
  • puppet连载22:define用法
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ​用户画像从0到100的构建思路
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌