servletresponse 获取返回结果_Java并发包源码分析:任务异步执行的结果Future和FutureTask...

2023-11-04

概述

  • Runnable任务在Executor线程执行器当中是异步执行的,而有些任务是需要返回执行结果的,故在Executor派生接口ExecutorService接口中定义了带返回结果的提交方法submit,其中返回结果为Future接口的对象。
  • Future接口主要提供了异步返回任务执行结果,取消任务执行,获取任务执行状态的功能,接口定义如下:

FutureTask:异步结果

  • Future接口的主要实现类为FutureTask,FutureTask同时实现了Runnable和Future接口,故对应的对象实例可以作为任务提交到Executor线程执行器中执行,然后通过自身来获取任务执行结果或者取消任务执行:
  • 即FutureTask的对象实例被Executor线程执行器内部线程池的某个工作线程和调用get方法等待获取结果的应用主线程所共享,故Executor内部线程池的工作线程在执行完这个任务后,可以通知和唤醒调用get阻塞等待执行结果的应用主线程,应用主线程也可以取消该任务的执行,然后通知工作线程。
  • 在FutureTask中定义了volatile修饰的状态变量state来进行Executor中的工作线程和应用主线程之间的交互,即工作线程产生任务执行结果,通知应用主线程获取;应用主线程请求取消任务执行,通知工作线程停止该任务执行。在内部实现中通过将state与以下状态常量进行大小比较来获取任务执行情况,如是正常执行成功还是异常退出,被取消等。

一、提交任务到Executor线程执行器

  • 提交任务到Executor线程执行器,对应AbstractExecutorService的submit方法实现如下:在submit中创建了一个FutureTask对象来包装应用定义的Runnable接口实现类task,调用execute将该对象交给Executor线程执行器执行,然后返回该对象引用给应用主线程。

二、应用主线程调用get等待执行结果

  • 在FutureTask中的get方法实现如下:
  • 任务状态state小于等于COMPLETING表示任务还没开始执行,则应用主线程调用awaitDone阻塞休眠,等待Executor的工作线程执行任务并通知唤醒该应用主线程。具体过程如下:
  • 在FutureTask内部维护了一个单向链表waiters,用于存放当前等待该任务执行结果的线程,在任务执行完成时,遍历该链表,唤醒每个等待线程。

三、Executor工作线程执行任务

  • Executor的工作线程执行该任务时,会调用该任务的run方法,即FutureTask的run方法,如下为FutureTask的run方法定义:首先检查任务状态state是否为NEW,是,即还没执行过也没有被取消等,则进行往下执行。执行完成之后,产生执行结果result,调用set方法来处理这个结果。
  • set方法的定义如下:将执行结果赋值给FutureTask的成员变量outcome,更新任务执行状态state为NORMAL,最后调用finishCompletion通知所有等待这个任务执行结果的线程。
  • finishCompletion的实现如下:遍历任务等待线程链表,使用LockSupport.unpart唤醒对应的线程,然后将该等待线程从链表中移除。
  • 然后回到get方法,应用主线程从awaitDone阻塞返回后,通过report方法来检测执行状态并返回任务执行结果。

四、应用主线程取消任务

  • 在应用主线程中,可以通过调用FutureTask的cancel方法来取消该任务的执行,cancel方法的定义如下:主要是更新任务的状态state为INTERRUPTING或者CANCELLED,然后根据mayInterruptIfRunning来控制如果该任务已经在执行,是否中断对应的工作线程来中止该任务的执行,最后调用finishCompletion方法来唤醒等待这个任务执行结果的线程,避免该任务被取消后,这些线程还在阻塞等待结果。
  • 在Executor的工作线程执行这个任务时,会调用FutureTask的run方法,在run方法中是先检查任务的状态state,如果发现不是NEW,即可能是CANCELLED,INTERRUPTING等,则直接返回,退出该任务的执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

servletresponse 获取返回结果_Java并发包源码分析:任务异步执行的结果Future和FutureTask... 的相关文章

  • Android versions (Android 版本)

    Android versions Android 版本 All Android releases https developer android com about versions Android 1 0 G1 Android 1 5 C
  • vue怎么在一个页面里写两个表格_vue项目中将element-ui table表格写成组件

    表格中我们经常需要动态加载数据 如果有多个页面都需要用到表格 那我希望可以有个组件 只传数据过去显示 不用每个页面都去写这么一段内容 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 查看 16 编辑 17 18 19
  • 《百面机器学习》学习笔试之模型评估(第2章)

    01 评估指标的局限性 准确率 Accuracy 的局限性 A c c u r a c y
  • 服务器输入nvidia-smi报错:

    发现服务器好像有挖矿程序再跑 我重启了一下 结果重启后nvidia smi报错了 NVIDIA SMI has failed because it couldn t communicate with the NVIDIA driver Ma
  • 运维36讲第10课:基于 Python+Ansible+Django 搭建 CMDB 平台

    本课时我们主要讲解如何基于 Python Django Ansible 开发一套具备 Devops 理念的自动化任务执行和资产管理 CMDB 系统 工程简介 这个可以实现自动化任务执行和资产管理的系统取名为 Imoocc 它是基于 Pyth
  • element ui 对话框设置固定宽度

    宽度设置width属性 默认是百分比 如 width 30 表示宽度为 其父元素宽的 30 想给固定宽度 使用v bind指令 加上px单位即可 width 300px 注意引号
  • 如何查看公众号文章的排版格式字体大小

    Q1 如何查看公众号文章的排版格式 字体 大小 颜色 行间距 页边距等 注意 如果是长图形式 图片中的文字 无法使用这个方法 总共三步 1 电脑端打开微信文章 复制链接地址 点击下方红框 2 在浏览器中粘贴 跳转显示该文章 3 鼠标选中字体
  • 对傅里叶变换的一些思考

    1 时域中的周期对应傅里叶变换的离散 2 时域的非周期对应傅里叶变换后的连续 3 将一个非周期信号傅里叶变换后 得到频谱图 其中横坐标是频率 纵坐标是幅值密度 而不是幅值 量纲是幅值的单位 Hz 所以这个频谱图里面各个频率对应的波的幅值应该
  • 简单博弈论(Nim游戏)

    891 Nim游戏 题目 提交记录 讨论 题解 视频讲解 给定 n 堆石子 两位玩家轮流操作 每次操作可以从任意一堆石子中拿走任意数量的石子 可以拿完 但不能不拿 最后无法进行操作的人视为失败 问如果两人都采用最优策略 先手是否必胜 输入格
  • 图像分类之PaddleClas网络预训练模型加载方法

    PaddlePaddle简介 PaddlePaddle是非常好用的深度学习库 尤其是2 0版本发布以来 高低层API可以自由结合使用 优点如下 可以像tensorflow里面的keras一样非常方便的用几行代码完成模型构建和训练 可以像py
  • 【图像处理】彩色图直方图统计

    首先要知道彩色图是没有直方图的 只能在rgb方向分别求直方图在合并一下 干脆不用这么麻烦 用rgb2gray转到灰度图 再在二维上进行直方图绘制 最后还提供了代码 找出直方图中横坐标 像素值 为50以下的纵坐标 以此为像素的个数 的和 cl
  • 代码精简10倍,责任链模式yyds

    目录 什么是责任链 使用场景 结语 前言最近 我让团队内一位成员写了一个导入功能 他使用了责任链模式 代码堆的非常多 bug 也多 没有达到我预期的效果 实际上 针对导入功能 我认为模版方法更合适 为此 隔壁团队也拿出我们的案例 进行了集体
  • K8S中安装kafka集群问题总结

    k8s下kafkacluster的安装 https github com banzaicloud kafka operator 问题一 镜像无法拉取 由于镜像源在国外被墙的原因 无法从源镜像下载 一般走镜像代理的形式 先从代理仓库docke
  • Ubuntu16.04 完全卸载opencv

    cd XXX opencv build 进入build目录 sudo make uninstall 卸载掉配置路径中的文件 sudo rm r build 删除build文件
  • Windows10家庭版 Windows defender 安全中心显示 页面不可用

    前言 今天使用电脑时出现了如下情况 倒没有发现电脑有什么实质的问题 只是不太理解又觉得好奇 于是就上网查了查 因为没有发现电脑有什么实质的问题 所以犯懒没有鼓捣自己的电脑 以下内容皆由网络所得 由本人整理汇总 希望有所帮助 可能的原因与解决
  • IOU(Intersection Over Union) 概念清晰图解 + python代码示例

    IOU Intersection Over Union 交并比 Intersection over Union IoU 目标检测中使用的一个概念 是产生的候选框 candidate bound 与原标记框 ground truth boun
  • C++ gstreamer函数使用总结

    目录 1 GSteamer的基本API的使用 这个播放mp4报错 这个创建play bin 返回0 不能运行 这个值得看 2 创建元件并且链接起来 3 添加衬垫 添加回调 手动链接衬垫 4 打印gstreamer的版本信息 5 gstrea
  • vim-指定区域查找替换

    vim中的区域查找替换 vim这么强大的工具当然是支持只替换一部分文本啦 那么怎么实现呢 最直接的方式 1 用v选中文本 2 然后 这样的话 命令默认形式是 lt gt s source source abc g 繁琐的方法 a bg fr
  • C/S与P2P的主要区别以及相同点

    C S方式所描述的是进程之间服务和被服务的关系 客户是服务的请求方 服务器是服务的提供方 服务的请求方和提供方都要使用网络核心部分所提供的服务 客户程序被用户调用后运行 在通信时主动向远地服务器发起通信 服务请求 因此 客户程序必须知道服务

随机推荐

  • Python爬虫系列(二)——Python爬虫批量下载百度图片

    1 前言 先贴代码 coding utf8 import requests import json from urllib import parse import os import time class BaiduImageSpider
  • 关于LayUI 表格高度解决方案

    需求是这样式的 我有一个产品列表 但是我想在产品列表中显示产品主图信息 本文只涉及LayUI技巧 不涉及JAVA JS 渲染部分 table render cellHeight 300 elem currentTableId url Pro
  • AIX 上压缩与解压缩

    gz gzip d 或 gunzip gzip Z uncompress compress tar tar xvf tar cvf cpio cpio idumv zip unzip 或 jar xvf tar gz gzip dc tar
  • 心跳包实现的另一种机制

    因为工作关系 经常用到心跳包 之前是在服务端中的连接的实体中保持一个timer 每秒加一 每次服务端接到客户端的心跳 就会把计数置为0 当累加到20秒的时候 服务端会接到客户端抛出的掉线函数回调 就会视为客户端掉线 然后从缓存中删掉掉线用户
  • 一次性搞懂什么是AIGC!

    你知道什么是AIGC吗 不知道 没关系 我来告诉你 AIGC就是人工智能生成内容 Artificial Intelligence Generative Content 也就是让AI自己动手创作各种各样的内容 比如图片 视频 音乐 文字等等
  • DNSPod 查看域名解析的 domain_id 和 record_id

    本文介绍调用 API 获取 DNSPod 域名解析需要的 domain id 和 record id 参数的方法 所有的 DNSPod API 请求都必须提供 login token作为公共参数以验证用户身份是否合法 获取 login to
  • 软件版本命名规范

    1 版本命名规范 1 2 3 20190114 rc 由四部分组成 第一位 1 主版本号 当功能模块有较大的变动 比如增加多个模块或者整体架构发生变化 此版本号由项目决定是否修改 第二位 2 子版本号 当功能有一定的增加或变化 比如增加了对
  • [小程序实现保存图片到相册]

    保存图片到相册 实现逻辑 首先查看用户申请过的权限中是否有 保存图片到相册 如果没有这个权限 则需要先申请权限 弹窗授权 如果用户同意授权则保存图片 如果用户不同意 则跳转到设置页 重新授权 然后再保存图片 查看用户申请的全县有哪些 通过微
  • Httpservlet cannot be resolved to a type的原因与解决方法

    刚开始学习Servlet 在Eclipse中新建了一个Servlet 不过页面上报错 Httpservlet cannot be resolved to a type 显然是Eclipse找不到相应的包 即javax servlet 原因
  • 重建控制文件 recreate control file

    简单总结如下 1 启动到mount2 执行Alter database backup controlfile to trace 3 找到第2步生成的trace文件 并作相应修改 只保留创建语句4 shutdown并启动到nomount 执行
  • 2023备战金三银四,Python自动化软件测试面试宝典合集(二)

    马上就又到了程序员们躁动不安 蠢蠢欲动的季节 这不 金三银四已然到了家门口 元宵节一过后台就有不少人问我 现在外边大厂面试都问啥 想去大厂又怕面试挂 面试应该怎么准备 测试开发前景如何 面试 一个程序员成长之路永恒绕不过的话题 每每到这个时
  • DETR,YOLO模型计算量(FLOPs)参数量(Params)

    前言 关于计算量 FLOPs 参数量 Params 的一个直观理解 便是计算量对应时间复杂度 参数量对应空间复杂度 即计算量要看网络执行时间的长短 参数量要看占用显存的量 计算量 FLOPs FLOP时指浮点运算次数 s是指秒 即每秒浮点运
  • scrapy框架之item pipeline的使用

    转载 https blog csdn net kuangshp128 article details 80321099 一 关于scrapy中pipleline的基本认识 Item Pipeline又称之为管道 顾名思义就是对数据的过滤处理
  • 集线器端口上的电涌:一个USB设备超过其集线器端口的电源限制

    集线器端口上的电涌 一个USB设备超过其集线器端口的电源限制 花了三个小时查阅了大量资料 终于把这个问题大致弄清楚了 差点全盘格式化 主要是因为不认盘的缘故 以为分区表全部损坏 我一开始就怀疑是供电不足 当然以前也碰到过类似的情况 通常重启
  • MySQL数据库查询字符串数据格式之不足自动填充“0”字符以达到指定位数

    MySQL数据库查询字符串数据格式之不足自动填充 0 字符以达到指定位数 在MySQL数据库中 很多时候我们的数据会跟我们想要的输出结果有出入 例如在数据库中 如果我们保存的是1 但是我们需要他输出显示的是001 那就需要我们在数据1的前面
  • 【Linux】调试器:gdb 的基本使用

    文章目录 前序工作 readelf 基本操作 l 显示代码 list r 运行程序 开始调试 run b 打断点 breakpoint info b 查看 断点 information d 删除 断点 delete disable 关闭 断
  • Android 占位式插件化原理实现(三) 如何在插件APP中使用动态广播

    写在前面 前面实现了插件APP的Activity和Service的启动 今天咱来说一下动态广播的使用 还是老套路 使用宿主环境注册和发送 基于宿主Activity注入到插件Activity的Context 一 项目目录 新增文件 宿主APP
  • ai算子是什么_AI当自强:独家揭秘旷视自研人工智能算法平台Brain++

    转载自 机器之心 随着深度学习逐渐从实验室走向工业应用 各大企业都在探索构建算法架构 实现模型的工具和平台 和使用 TensorFlow 或 PyTorch 等开源框架的公司不同 旷视走向了一条自主研制的道路 建立了从算法研发到部署应用的全
  • 深度学习种 数据shuffle对模型性能的影响

    博客部分内容参照链接 https blog csdn net g b l article details 109600536 相同的两个目标检测实验 模型进行shuffle和未进行shuffle时训练的loss图 发现 未经shuffle的
  • servletresponse 获取返回结果_Java并发包源码分析:任务异步执行的结果Future和FutureTask...

    概述 Runnable任务在Executor线程执行器当中是异步执行的 而有些任务是需要返回执行结果的 故在Executor派生接口ExecutorService接口中定义了带返回结果的提交方法submit 其中返回结果为Future接口的