宏任务和微任务执行顺序_确保任务的执行顺序

宏任务和微任务执行顺序

有时有必要对线程池中的任务施加一定的顺序。 JavaSpecialists通讯的第206期提出了一种这样的情况:我们使用NIO从多个连接中读取数据。 我们需要确保来自给定连接的事件按顺序执行,但是不同连接之间的事件可以自由混合。

我想提出一个类似但略有不同的情况:我们有N个客户。 我们希望按照给定客户端的提交顺序执行事件,但是来自不同客户端的事件可以自由混合。 另外,有时还会有涉及多个客户端的“汇总”任务。 此类任务应阻止所有相关客户端的任务(但不能阻止更多!)。 让我们看一下情况图:

如您所见,客户端A和客户端B的任务被并行地愉快地处理,直到出现“汇总”任务。 到那时,不再可以处理类型A或B的任务,但是可以执行无关的任务C(前提是有足够的线程)。 我的存储库中提供了这种执行程序的框架。 核心是以下界面:

public interface OrderedTask extends Runnable {boolean isCompatible(OrderedTask that);
}

使用此接口, A.isCompatible(B) && B.isComaptible(A)确定两个任务是否可以并行运行(如果A.isCompatible(B) && B.isComaptible(A)则A和B可以并行运行)。 这些方法应以快速,非锁定和时不变的方式实现。

该线程池背后的算法如下:

  • 如果要添加的任务与任何现有任务不冲突,请将其添加到元素最少的线程中。
  • 如果它与来自一个线程的元素冲突,则将其安排在该线程上执行(并隐式地冲突元素之后执行,以确保提交顺序得以保持)
  • 如果它与多个线程冲突,则在第一个线程上等待任务的第一个线程以外的所有任务上添加任务(下面用红色显示),然后在该任务上执行原始任务。

有关实现的更多信息:

  • 该代码仅是概念验证,还需要更多代码才能使其具有生产质量(它需要代码来执行任务中的异常处理,正确关闭等)。
  • 为了获得最佳性能,它使用可用的无锁*结构:每个工作线程都有一个关联的ConcurrentLinkedQueue。 为了达到睡眠直到工作可用的语义,使用了额外的信号量**
  • 为了能够将新的OrderedTask与当前执行的OrderedTask进行比较,请保留其引用的副本。 每当新元素入队时,此副本列表就会更新(这可能会导致内存泄漏,并且如果任务不频繁,则应研究足够的替代方法,例如为弱引用提供额外的计时器)
  • 与JavaSpecialists时事通讯中的解决方案相比,这更类似于固定线程池执行器,而时事通讯中的解决方案类似于缓存的线程池执行器。
  • 如果(a)任务(大多数)短且(大多数)统一,并且(b)提交新任务的线程很少(一个或两个),因为多个提交是互斥的(但提交和执行不是' t)
  • 如果在提交“汇总”之后(并且可以执行之前)立即提交相同类型的任务,则不必要地将它们强制在一个线程上。 如果这成为问题,我们可以在汇总任务完成后添加代码重新排列任务。

玩转源代码吧! (也许有一天我会花时间去除所有粗糙的边缘)。

*有点用词不当,因为仍然有锁,仅在较低级别(CPU而不是OS)级别上使用,但这是公认的术语

** –基准测试表明这是性能最高的解决方案。 这是从ThreadPoolExecutor的实现中得到启发的。

参考:在Java Advent Calendar博客上, 确保 JCG合作伙伴 Attila-Mihaly Balazs 执行任务的顺序 。

翻译自: https://www.javacodegeeks.com/2012/12/ensuring-the-order-of-execution-for-tasks.html

宏任务和微任务执行顺序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言中aver是什么意思_Linux系统top命令中的io使用率,到底是什么意思?

最近在做连续数据流的缓冲系统,C语言代码实现后,粗略测试了下,功能上应该没有问题。那么,接下来就该测试性能了。输入 top 命令,的确可以看到一系列 cpu 使用率,其中一个值得注意的子项就是 io 使用率了&am…

wireshark捕获选项不能用_wireshark的一些基础用法,欢迎收藏

About WiresharkWireshark是世界上最重要和使用最广泛的网络协议分析器。它让您在微观层次上看到网络上正在发生的事情,并且是许多商业和非营利性企业、政府机构和教育机构事实上(通常也是法律上)的标准。Wireshark的发展得益于全球网络专家的志愿贡献,并…

管理沟通-沟通框架

背景 管理三明治的承托,管理沟通。离开了沟通,所有的工作都将搁浅而无法前进。 常见话题: 向上沟通员工激励团队凝聚力提升向下沟通工作特点 工作职责说明技术开发计算机,编程语言,设计算法,开发功能&#…

NetBeans 9抢先体验

Java 9即将来临,NetBeans 9也即将来临。在本文中,我们将看到NetBeans 9 Early Access为开发人员提供的支持,以帮助他们构建Java 9兼容的应用程序。 Java 9提供了许多(大约90种) 新功能,包括Modules和JShel…

块裁剪后的矩形边界如何去掉_手持拍摄画面太抖?这节课教你如何快速稳定抖动的画面...

手持相机进行拍摄,画面会有较为明显的抖动,这节课就教大家如何稳定视频画面。素材导入到PR后,为素材添加变形稳定器效果,软件会自动开始分析。当前素材上方会显示在后台分析,这时候我们可以剪辑其他部分,并…

怎么把空字符串去掉_Python知识点字符串转整数需注意

↑↑↑关注后"星标"简说Python人人都可以简单入门Python、爬虫、数据分析简说Python严选 来源:简说Python 作者:老表One old watch, like brief python大家好,我是老表~Python知识点系列,学习了记得点赞、…

android-x86 镜像iso下载_Windows 10(1909)最新12月更新版MSDN官方简体中文原版ISO镜像下载+激huo工ju...

微软已于11月中旬开始大规模推送Windows 10操作系统的最新版本1909。此次更新官方未放出具体更新日志,但没有太多大功能更新,主要还是“修修补补”为主。现在,为大家带来本次官方最新原版ISO镜像下载,具体内部版本号为18363&#…

32查运行内存的map文件_Spark Shuffle调优之调节map端内存缓冲与reduce端内存占比

本文首先介绍Spark中的两个配置参数: spark.shuffle.file.buffer map端内存缓冲 spark.shuffle.memoryFraction reduce端内存占比很多博客会说上面这两个参数是调节Spark shuffle性能的利器,实际上并不是这样的。以实际的生产经验来说,这两个参数没…

odoo self.ensure_one()

源码: def ensure_one(self): """ Verifies that the current recorset holds a single record. Raises an exception otherwise. """ try: # unpack to ensure there is only one value is faster than len when…

模板 字段_劲爆新功能:轻流文字识别(OCR)功能支持自定义识别模板啦

Hi,又和大家见面啦~前段时间我们的文字识别(OCR)功能推出后,由于只支持系统提供的固定识别模板,很多客户跟我们反馈说:希望可以自定义识别模板!现应大家的要求,轻流「文字识别(OCR)」的「自定义…

Java 9中的进程处理

一直以来,用Java管理操作系统进程都是一项艰巨的任务。 这样做的原因是可用的工具和API较差。 老实说,这并非没有道理:Java并非出于此目的。 如果要管理OS进程,则可以使用所需的Shell,Perl脚本。 对于面临更复杂任务的…

拼音缩写是啥意思_NMSL?AWSL?这些拼音缩写到底是啥意思?

我绝对没有在骂你们,我只是单纯的举个例子而已。我们在网上冲浪时经常可以看到这些几个字母组成的拼音缩写,对于知道这些梗的人一眼就能GET到,但对于不明白的人来说猜来猜去也猜不出啥意思。所以今天就来给大家科普几个经常出现的拼音缩写&am…

python利用自动识别写模块_序章:资料预处理(python3.6 可用fortran unformatted sequencial data读取模块)...

首先我只是一个接触Python约半年的菜鸟,开这一个专栏的目的主要是记录自己所学,以及实践的一些有用的东西,顺便分享一些自己写的公用代码段以方便具有同样想法的朋友。 既然是序章我就多写一些吧,我本人对人工智能在气象方面的应用…

python蟒蛇代码_011 实例2-Python蟒蛇绘制

一、"Python蟒蛇绘制"问题分析 1.1 Python蟒蛇绘制 用程序绘制一条蟒蛇 貌似很有趣,可以来试试 先学会蟒蛇绘制,再绘朵玫瑰花送给TA 设计蟒蛇的基本形状:问题1: 计算机绘图是什么原理? 一段程序为何能够产生窗体&#x…

bjd luts_BJD娃娃背后的圈层文化:一个“成品娃”拍出22万元天价!

■ 作者 黑马君 | 黑马品牌(ID:heimapinpai)现如今“Z世代”已经成为品牌营销中不可忽略的一个关键词,作为消费升级浪潮的主力军,他们早已成为品牌重点目标人群。与90后、80后不同,Z世代成长于互联网迅猛发展的时代,追…

qtcreator版本_【IDE】ROS开发环境之Qt Creator的安装与配置

可以用于ROS开发的IDE很多(可以参考【工具合辑】ROS工程师都在用什么IDE开发呢?用哪种IDE开发更加高效呢? ),ROS的调试依赖环境变量,与外部程序有通讯,因此要求启动IDE的时候加载ROS环境参数,其他方面并无太…

java线程死锁_Java并发:隐藏线程死锁

java线程死锁大多数Java程序员熟悉Java线程死锁概念。 它本质上涉及2个线程,它们彼此永远等待。 这种情况通常是平面(同步)或ReentrantLock(读或写)锁排序问题的结果。 Found one Java-level deadlock:"pool-1-t…

空间滤波_第三章 灰度变换与空间滤波-(六)锐化空间滤波器之非锐化掩蔽

知识使人自由,印刷术使知识自由。按照书中的顺序,我们插入一章非微分模式下的锐化的方法,非锐化掩蔽。这种方法在印刷术和出版界已经用了好多年了,具体的过程:模糊原图像从原图像中减去模糊图像(产生的差值…

go语言io reader_【已解决】go语言中如何使用io的MultiWriter

【背景】折腾:期间,需要去搞懂:如果新建和设置MultiWriter。【折腾过程】1.参考:去看看:2.然后去试试代码:var filenameOnly stringfilenameOnly GetCurFilename()fmt.Println("filenameOnly", …

golang 包含文本_Golang教程之Web篇(七)

首先,大家一起思考一个问题:何为Web编程?严格来说,这只是一个叫法,并没有学术上的定义,但是一般大家都说到web都是指浏览器相关,所以大家一般说的web开发要么是PC Web要么就是手机Web&#xff0…