范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Java19的结构化并发,一种新的多线程编程模式

  #头条创作挑战赛#
  结构化并发在 Java 19 中是孵化功能,比预览功能的成熟度更低。想要尝鲜的朋友可以试试。想要在 LTS 版本中使用该功能,估计得等到 Java 25了。
  结构化并发并不是一个新鲜的名词,这个概念已经出现很久了。Kotlin 的协程(Coroutines)就已经实现了结构化并发。Java 19 中引入了结构化并发,可以作为一个新的多线程编程模式。结构化并发和虚拟线程(说一说 Java 19 中的虚拟线程)都来自 OpenJDK 的 Loom 项目。多线程编程的难点
  多线程编程一直以来都是 Java 开发中比较复杂难懂的部分。这一方面是多线程编程自身的复杂性,另外一方面则是由于语言和标准库的限制。如果给你一个开发任务,让你在单线程中完成,那肯定会简单很多。比如下面的一段代码,在 takeAction 方法里面,分别调用 callOp1 和 callOp2 方法来得到两个值,最后再把用得到的结果值来调用 callOp3。int takeAction(String input) {   int result1 = callOp1(input);   int result2 = callOp2(input);   return callOp3(result1, result2); }
  如果 takeAction 方法在同一个线程中执行,那么整个方法内部的调用流程是很清晰的。当 takeAction 方法返回时,callOp1、callOp2 和 callOp3 方法必定已经完成,或者由于之前的错误还未被调用。也就是说,这些方法的状态是确定的,只能处于执行成功、执行失败和未执行这三种状态之一。
  如果 callOp1、callOp2 和 callOp3 这3个方法都是在各自的线程中运行的,那么很多在单线程情况下理所应当的结论,就不会成立了。这些方法的状态会变得更复杂:由于执行方法的线程池的负载过大,方法处于等待执行的状态。执行方法的线程可能被中断,导致方法的执行被取消。callOp1 和 callOp2 是并行执行的,如果 callOp1 在执行中产生了错误,而此时 callOp2 如果还在执行中,应该取消 callOp2 的执行,因为 takeAction 会以错误的结果返回,callOp2 的结果不再需要了。当 takeAction 方法以错误的结果返回时,callOp2 可能仍然还在执行中,直到得到最后的结果,但是这个结果会被丢弃。这是因为对 callOp2 的取消请求可能未得到及时的响应。任何一个任务的执行时间可能都过长,比如它可能需要等待别的任务完成。这就要求妥善处理超时的问题。
  这是多线程开发难以掌握的原因之一,因为它要求你考虑各种复杂的情况,拉高了开发的门槛。在实际的开发中,我们会使用 Java 标准库和第三方库提供的 API 来进行多线程开发。这可以在一定程度上简化开发。任务执行
  在多线程开发中,绝大部分的工作都可以抽象成任务执行。这些任务的执行有下面这些特点:执行流程从主任务开始。主任务会被划分成多个子任务。子任务可以被进一步划分。全部的任务会组成一个树形结构。每个任务在独立的线程中执行。任务的执行可能成功或失败,也可能被取消。父任务负责管理子任务。根据子任务的执行状态,已有的正在运行的子任务可能被取消,新的子任务可能被创建。任务之间通过线程安全的数据结构来共享数据,或者使用消息传递机制来进行通信。
  在目前的 Java 开发中,对于这样多线程任务的执行,一般使用的是 CompletableFuture 或 ListenableFuture 的级联方式。每个任务返回一个 CompletableFuture 对象来表示执行的结果。如果执行成功,CompletableFuture 表示得到的结果值;如果执行失败,CompletableFuture 表示产生的异常。使用 CompletableFuture 时并不是直接获取结果,而是添加一个回调方法,表示当前任务执行之后的下一步操作。
  同样的 takeAction 方法,如果用 CompletableFuture 来实现,会是下面这样的代码。与单线程的代码相比,CompletableFuture 的代码并不直观。CompletableFuture takeAction(String input) {   var result1 = callOp1(input);   var result2 = callOp2(input);   return result1       .thenCombine(result2, (v1, v2) -> new int[] {v1, v2})       .thenCompose(values -> callOp3(values[0], values[1])); }结构化并发
  对于结构化并发(Structured Concurrency),并没有一个清晰的解释。结构化并发要解决的问题是,如何让开发人员更加容易地编写并发代码,尽可能地对开发人员屏蔽多线程相关的细节。具体来说,结构化并发让你以类似单线程的方式来编写多线程代码。
  由于结构化并发在 Java 19 中是孵化功能,相关的模块需要被显式地启用。这是通过添加 javac 和 java 的参数 "--add-modules jdk.incubator.concurrent" 来实现的。
  结构化并发使用了前面提到的任务执行的概念。在使用结构化并发之前,首先需要创建一个结构化任务作用域(scope),然后在这个作用域中创建并执行任务。这些任务的生命周期由作用域负责管理。 当作用域被关闭时,其中所包含的任务都会结束。这就意味着开发人员不用处理任务的失败、取消和超时等情况,完全由底层平台提供支持。
  在一个作用域中,其中创建的任务中也可以创建自己的作用域,用来管理该任务的子任务。这就形成了一个任务组成的树形结构。
  使用结构化并发的基础类是  jdk.incubator.concurrent.StructuredTaskScope。StructuredTaskScope 表示的是一个使用结构化并发的作用域。
  下表列出了 StructuredTaskScope 中的方法。
  方法
  说明
  fork(Callable<? extends U> task)
  启动一个线程来执行任务
  join()
  等待所有任务执行完成,或当前作用域被关闭
  joinUntil(Instant deadline)
  与 join() 相同,只不过设置了终止时间
  shutdown()
  结束任务作用域
  close()
  关闭任务作用域
  下面的代码给出了 StructuredTaskScope 的使用示例,用来实现 takeAction 方法。在 takeAction 方法中的作用域中创建了调用 callOp1 和 callOp2 的子任务。等这两个子任务完成之后,使用得到的结果调用 combine 方法。combine 方法中也创建了作用域,调用了 callOp3 一个子任务。public class StructuredWay {   int takeAction(String input) throws InterruptedException, ExecutionException {     try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {       Future v1 = scope.fork(() -> callOp1(input));       Future v2 = scope.fork(() -> callOp2(input));       scope.join();       scope.throwIfFailed();       return combine(v1.resultNow(), v2.resultNow());     }   }    int combine(int result1, int result2) throws InterruptedException, ExecutionException {     try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {       Future r = scope.fork(() -> callOp3(result1, result2));       scope.join();       scope.throwIfFailed();       return r.resultNow();     }   } }
  使用 StructuredTaskScope 的基本流程如下:主任务创建一个 StructuredTaskScope 对象。使用 fork 方法来创建子任务。使用 join 或 joinUntil 方法来等待子任务完成或取消。在 join 或 joinUntil 方法返回之后,处理子任务中可能出现的错误,并使用子任务产生的结果。关闭作用域对象,一般使用 try-with-resources 可以自动进行关闭。
  看到上面的代码,你的第一反应可能是这样的代码也很繁琐。不过这里的重点在于思维方式的变化。结构化并发的思维方式,更加类似传统的单线程应用,因此更容易理解。
  在上述的代码中,用到的是作用域的实现 ShutdownOnFailure。与它作用类似的是 ShutdownOnSuccess。ShutdownOnFailure 适用的是作用域中的所有任务都必须成功的场景。只要有一个任务失败,该作用域的 shutdown 方法会被调用,其他未完成的任务线程也会被中断。ShutdownOnSuccess 适用的是作用域中的任意任务成功即可的场景。只要有一个任务成功,该作用域的 shutdown 方法会被调用,其他未完成的任务线程也会被中断。
  对于作用域的任务,如果在执行中出现错误,可以调用 StructuredTaskScope 的 shutdown 方法来终止执行。调用 shutdown 方法会阻止新任务的执行,同时取消正在运行中的任务。
  关于结构化并发的基本介绍就到这里。由于结构化并发的实现还处于非常早期的阶段,API 可能发生在后续版本中产生变化。大家并不需要关注过多的细节,但是有必要关注这种即将到来的新的多线程编程模式,应该会让以后的多线程编程更简单。

为何大家都在吐槽联想,但一说笔记本电脑还是普遍认为联想最靠谱?术业有专攻,联想被吐槽的主要原因并不是它出品的电脑不行,联想的电脑还是做的可以的,这一点从市场占有率就看得出来,在全球市场上面,联想已经多次获得第一的位置了,在2021年第三季度中华为手机最后的倔强,Mate50能否王者归来?肯定会的,只是时间的问题,现在华为也努力解决5G射频芯片中滤波器的问题,量产后,就可以了,唯一的遗憾就是完全采用麒麟芯片SOC的机器短期内可能不会有啦。感谢邀请华为手机最后的倔强,腾讯双端MMORPG游戏塔瑞斯世界即将上线,号称不卖数值IT之家3月28日消息,由北京乐动卓越科技有限公司研发腾讯游戏代理发行的双端MMORPG游戏塔瑞斯世界亮相今晚的WeGame2023游戏之夜。制作人表示这款即将上线的游戏理念为不卖王者荣耀刘备增强后打野确实厉害,但短板仍然存在在王者荣耀中刘备被增强了,打架玩得好可以随便一挑三,一个二技能眩晕,加上招基本无敌了,这套招数基本就是要躲在草里来个出其不意!1强化霰弹冷却时间0s法力消耗0技能介绍被动刘备的火铳被WG联动新车背刺的悲剧神枪手!哪怕弱点致命,但它依然有趣各位车长老爷大家好啊!这周WG上架了M54变节者,今天咱们就来聊聊这辆新八金中的老面孔。它在刚加入时被一众主播吹得天花乱坠,但实际上手感却并没有那么炸裂,再加上圣诞活动里BZ176纯肉亚瑟确实强,永夜不死鸟,整局游戏不用回家,金牌拿到手软陌陌聊游戏,给您带来最新最快的王者资讯!相信很多的玩家都已经知道,S30赛季会在4月4日这天结束了!在还剩下不到一个星期的时间里,用什么样的英雄上分又快又稳呢?答案就是亚瑟!是的,如果败方MVP不掉星会发生什么?这些后果你有想过吗?王者荣耀的对局环境不好已经很久了,大家经常会遇见挂机,摆烂,演员等干扰玩家正常游戏的现象,针对这种现象王者也做出了很多的措施,比如调整匹配机制,增加信誉积分项目,鹰眼守卫队等一系列祛痘用什么牌子的产品最好?说实话我看到的90的祛痘分享都是假的,因为痘痘是分很多类型的,不可能随便用一个护肤品所有的痘痘就都好了呀,更不会before满脸痘一下就到after的磨皮效果了,过程图他们是不会放患有抑郁症是什么感觉?患病的主要原因是孤独吗?你好,希望所有人都能走近抑郁症,多了解抑郁症患者。肯定的说患有抑郁症是一种不好的情绪体验,会长时间的感到情绪低落,做什么事情都提不起兴趣,晚上睡不好,早上起床很痛苦,精力有明显的不狗扑咬人时,击打狗哪里最好?对于徒手打狗有以下几点经验,请大家参考。1,对于中型狗如果冲过来,一定不能怕,手要快,胆子要大,第一时间抓狗耳朵,如果抓不到耳朵就抓后颈,狗的皮肤一般比较松弛,后颈比较好抓,提起一接下来5年,在连云港哪个位置买房最好?我觉得应该是连云新城,连云港如果海滨发展不起来,整个城市都不会发展起来。不在海边有套房,怎么能说是海滨城市的人呢?连云港哪个位置买房?肯定是高新区东区最好了,配套设施好,环境好,学
那些神仙句子,建议收藏(手握玫瑰之人,无需神祗)1。世界或岁月的本身就是由一系列说不清的事情组成的。2。我期望人生厚重,每日却以浮沫填充。3。走了许多路,还是走向你。4。愿君跃而高悬如朗朗明月,清风拂过眉间。5。你牵我赴往春山,宋朝是大一统王朝吗?为什么要纠结大一统这个问题呢?对于宋朝,大多数人的印象都是弱小,除此之外对于宋朝有没有实现的大一统也存在争论。不少人认为无论是北宋还是南宋存在时期都有其他政权,比如北宋与辽朝西夏共存,南宋与金朝蒙古共存。南宋确飞眼三国(五)跟诸葛亮的急智相比,司马懿具备的是长谋,为了远大的目标不在乎一时一地的得失,将以有为也。没有人比司马懿更清楚。知道谁是自己的敌人比知道谁是自己的朋友更重要。因为,作为阴谋篡国者可能1953年,毛主席视察南京,为何专门询问戴笠墓不要把他搞掉戴笠一生作恶多端,特别是在追随蒋介石的道路上,犯下了很多罪孽。正是这样一个人,却死得非常蹊跷,关于他的墓也有一些奇特故事,在新中国成立之后,墓的去留问题也引人讨论,毛主席还为此专门这场战争,真是打成了一锅粥!非洲现代史上不乏惨烈的战争,发生在20世纪70年,埃塞俄比亚和索马里之间的欧加登战争就是其中之一。欧加登(索马里语Ogaadeen)最初是指索马里人的土地这场战争是殖民者埋雷与冷战户外电源充电速度黑科技出现,充满3。6度电要多久?近年来,户外达人越来越多,外出旅游交友直播拍摄无人机比赛等各种活动越来频繁,也催生了户外电源的快速发展。随着户外电源的发展趋势,可以供用户选择的户外电源越来越多,但能够做到高性能便全球已经有10万脑机接口人?酷玩实验室作品首发于微信号酷玩实验室微信IDcoollabs2014年6月12日,高位截瘫的少年JulianoPinto踢出了第一脚球,宣告巴西世界杯正式开赛。全世界的眼光集中到了人类在不知不觉之中,已经吃了8000年的转基因甘薯,你信吗?我们大家都喜欢吃甘薯,甘薯就是人们所说的山芋红薯番薯蜜薯。我国是世界上种植甘薯最大的国家,但甘薯并非起源于中国。考古学家认为甘薯起源于美洲中南部,在秘鲁的奇尔卡峡谷的一个大洞穴中发超强性能512GB大存储,三款适合用五年以上的手机在我的理解中,一款手机要用五年以上,主要取决于两个方面,第一个是性能得强,因为随着各种应用越来越臃肿功能越来越复杂系统特效越来越先进,对于手机性能的要求也越来越高第二个就是存储得大厉害了!中国自主研发地表时速620磁悬浮列车后,却被美国说剽窃没想到,中国人提前实现了。此消息传来后,其中,就有一部分美国人指责中国剽窃美国技术,可是美国都没有的技术,我们怎么剽窃呢?据悉在1911年,超导体概念就已经被提了出来,但是要把它应美股再次暴跌,世界在悄然间巨变作者水木然近日,美股再次大暴跌,这是一场史无前例的股灾!道指纳指标普均创近两个月新低!过去一周,道指下跌4。13,纳指下跌5。48,标普500指数下跌4。77!美国科技六巨头也暴跌