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

宏任务和微任务执行顺序

有时有必要对线程池中的任务施加一定的顺序。 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的发展得益于全球网络专家的志愿贡献,并…

管理沟通-沟通框架

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

t’触发器真值表和状态方程_清写出触发器按逻辑特性的分类;写出T触发器的状态方程。...

下列对配电所的说法有误的一项是()。A.市区10kV公用配电所的供电半径一般不大于300m,在郊区的供成功的基础设施服务的提供者都首先是按照商业化的原则经营的,并至少具有几个基本特点,这些基本特我国幅员辽阔,能源分布不…

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知识点系列,学习了记得点赞、…

tree

随机走,看期望 由于zzn过于sb,考试推出来式子因为统计时间不对没有$AC$(应dfs前统计) zzn实在过于sb,式子和题解完全不一样,所以看题解的可以走了 记录tofa[x]表示当前点走到父亲期望步数 可以直接走到父亲 贡献$\frac{1}{deg[x]}$ 走到儿子再走到父亲$\frac{1}{deg[x]}*(1tofa…

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性能的利器,实际上并不是这样的。以实际的生产经验来说,这两个参数没…

element ui 表单验证为正整数

很多时候都会用表单中输入正整数的情况&#xff0c;在element ui中可以用el-input-number 标签来显示输入框是number类型的&#xff0c;或者type"number"也可以的&#xff0c;但是正整数就需要判断了 可以利用正则来判断 代码如下 <el-form ref"checkData&qu…

python用input输入列表_Python如何使用input函数获取输入

所谓输入&#xff0c;就是用代码获取用户通过键盘输入的信息。 例如&#xff1a;去银行取钱&#xff0c;在 ATM 上输入密码。 在 Python 中&#xff0c;如果要获取用户在键盘上的输入信息&#xff0c;需要使用到input()函数。 函数input()让程序暂停运行&#xff0c;等待用户输…

web.xml.jsf_使用JSF 2.0可以更轻松地进行多字段验证

web.xml.jsf开发应用程序表单时最常见的需求之一是多字段验证&#xff08;或跨字段验证&#xff0c;但我没有使用此术语&#xff0c;因为当我将其放在Google上时&#xff0c;实际上得到了一些战后图片&#xff09;。 我正在谈论的情况是&#xff0c;我们需要比较初始日期是早于…

odoo self.ensure_one()

源码&#xff1a; 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&#xff0c;又和大家见面啦&#xff5e;前段时间我们的文字识别(OCR)功能推出后&#xff0c;由于只支持系统提供的固定识别模板&#xff0c;很多客户跟我们反馈说&#xff1a;希望可以自定义识别模板&#xff01;现应大家的要求&#xff0c;轻流「文字识别(OCR)」的「自定义…

中文字符频率统计python_python统计字符串出现最多的字母及其出现次数

统计字符串出现最多的字母及其出现次数 另外如果次数相同按字母顺序排序。 方法1 可以使用自定义键对c.most_common()进行排序&#xff0c;该键首先考虑频率的降序&#xff0c;然后考虑字母的降序&#xff08;请注意lambda x: (-x[1], x[0]) &#xff09;&#xff1a; from col…

c#float取小数点后两位_C# 保留小数点后两位(方法总结)

最简单使用: float i=1.6667f; string show=i.ToString("0.00"); //结果1.67(四舍五入) 其他类似方法: string show=i.ToString("F");//"F2","f" 不区分大小写 string show=String.Format("{0:F}",i);//也可以为F2,或者&q…

Java 9中的进程处理

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

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

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

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

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