沧州三亚菏泽经济预测自然
投稿投诉
自然科学
知识物理
化学生物
地理解释
预测理解
本质社会
人类现象
行为研究
经济政治
心理结构
关系指导
人文遗产
菏泽德阳
山西湖州
宝鸡上海
茂名内江
三亚信阳
长春北海
西安安徽
黄石烟台
沧州湛江
肇庆鹤壁
六安韶关
成都钦州

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

4月8日 阴阳狱投稿
  头条创作挑战赛
  结构化并发在Java19中是孵化功能,比预览功能的成熟度更低。想要尝鲜的朋友可以试试。想要在LTS版本中使用该功能,估计得等到Java25了。
  结构化并发并不是一个新鲜的名词,这个概念已经出现很久了。Kotlin的协程(Coroutines)就已经实现了结构化并发。Java19中引入了结构化并发,可以作为一个新的多线程编程模式。结构化并发和虚拟线程(说一说Java19中的虚拟线程)都来自OpenJDK的Loom项目。多线程编程的难点
  多线程编程一直以来都是Java开发中比较复杂难懂的部分。这一方面是多线程编程自身的复杂性,另外一方面则是由于语言和标准库的限制。如果给你一个开发任务,让你在单线程中完成,那肯定会简单很多。比如下面的一段代码,在takeAction方法里面,分别调用callOp1和callOp2方法来得到两个值,最后再把用得到的结果值来调用callOp3。inttakeAction(Stringinput){intresult1callOp1(input);intresult2callOp2(input);returncallOp3(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的代码并不直观。CompletableFutureIntegertakeAction(Stringinput){varresult1callOp1(input);varresult2callOp2(input);returnresult1。thenCombine(result2,(v1,v2)newint〔〕{v1,v2})。thenCompose(valuescallOp3(values〔0〕,values〔1〕));}结构化并发
  对于结构化并发(StructuredConcurrency),并没有一个清晰的解释。结构化并发要解决的问题是,如何让开发人员更加容易地编写并发代码,尽可能地对开发人员屏蔽多线程相关的细节。具体来说,结构化并发让你以类似单线程的方式来编写多线程代码。
  由于结构化并发在Java19中是孵化功能,相关的模块需要被显式地启用。这是通过添加javac和java的参数addmodulesjdk。incubator。concurrent来实现的。
  结构化并发使用了前面提到的任务执行的概念。在使用结构化并发之前,首先需要创建一个结构化任务作用域(scope),然后在这个作用域中创建并执行任务。这些任务的生命周期由作用域负责管理。当作用域被关闭时,其中所包含的任务都会结束。这就意味着开发人员不用处理任务的失败、取消和超时等情况,完全由底层平台提供支持。
  在一个作用域中,其中创建的任务中也可以创建自己的作用域,用来管理该任务的子任务。这就形成了一个任务组成的树形结构。
  使用结构化并发的基础类是jdk。incubator。concurrent。StructuredTaskScope。StructuredTaskScope表示的是一个使用结构化并发的作用域。
  下表列出了StructuredTaskScope中的方法。
  方法
  说明
  fork(C?extendsUtask)
  启动一个线程来执行任务
  join()
  等待所有任务执行完成,或当前作用域被关闭
  joinUntil(Instantdeadline)
  与join()相同,只不过设置了终止时间
  shutdown()
  结束任务作用域
  close()
  关闭任务作用域
  下面的代码给出了StructuredTaskScope的使用示例,用来实现takeAction方法。在takeAction方法中的作用域中创建了调用callOp1和callOp2的子任务。等这两个子任务完成之后,使用得到的结果调用combine方法。combine方法中也创建了作用域,调用了callOp3一个子任务。publicclassStructuredWay{inttakeAction(Stringinput)throwsInterruptedException,ExecutionException{try(varscopenewStructuredTaskScope。ShutdownOnFailure()){FutureIntegerv1scope。fork(()callOp1(input));FutureIntegerv2scope。fork(()callOp2(input));scope。join();scope。throwIfFailed();returncombine(v1。resultNow(),v2。resultNow());}}intcombine(intresult1,intresult2)throwsInterruptedException,ExecutionException{try(varscopenewStructuredTaskScope。ShutdownOnFailure()){FutureIntegerrscope。fork(()callOp3(result1,result2));scope。join();scope。throwIfFailed();returnr。resultNow();}}}
  使用StructuredTaskScope的基本流程如下:主任务创建一个StructuredTaskScope对象。使用fork方法来创建子任务。使用join或joinUntil方法来等待子任务完成或取消。在join或joinUntil方法返回之后,处理子任务中可能出现的错误,并使用子任务产生的结果。关闭作用域对象,一般使用trywithresources可以自动进行关闭。
  看到上面的代码,你的第一反应可能是这样的代码也很繁琐。不过这里的重点在于思维方式的变化。结构化并发的思维方式,更加类似传统的单线程应用,因此更容易理解。
  在上述的代码中,用到的是作用域的实现ShutdownOnFailure。与它作用类似的是ShutdownOnSuccess。ShutdownOnFailure适用的是作用域中的所有任务都必须成功的场景。只要有一个任务失败,该作用域的shutdown方法会被调用,其他未完成的任务线程也会被中断。ShutdownOnSuccess适用的是作用域中的任意任务成功即可的场景。只要有一个任务成功,该作用域的shutdown方法会被调用,其他未完成的任务线程也会被中断。
  对于作用域的任务,如果在执行中出现错误,可以调用StructuredTaskScope的shutdown方法来终止执行。调用shutdown方法会阻止新任务的执行,同时取消正在运行中的任务。
  关于结构化并发的基本介绍就到这里。由于结构化并发的实现还处于非常早期的阶段,API可能发生在后续版本中产生变化。大家并不需要关注过多的细节,但是有必要关注这种即将到来的新的多线程编程模式,应该会让以后的多线程编程更简单。
投诉 评论 转载

丝袜真的是给女性朋友准备的吗?丝袜作为与服装搭配的时尚单品,深受众多女性的喜爱。在很多人的认知里,丝袜是女性的专属,但你知道吗?丝袜最初是为男性设计的。丝袜的起源可以追溯到1516世纪,当时贵族阶层的男人都……妻子赴美求援后,泽连斯基被用来命名无脊椎动物,扎哈罗娃合适据英国《皇家学会开放科学》杂志7月20日报道,一种在非洲发现的海洋无脊椎动物残骸被正式命名为泽连斯基。这是一种发现于埃塞俄比亚的海百合残骸,生活于距今2。01亿年到1。45亿年……名师推荐2022年全国各地高考数学分类汇编含详解,请家长收藏PDF电子版下载方式详见篇尾说明包括高考数学新课程全国1卷、全国2卷、全国甲卷(文理)、全国乙卷(文理)、浙江卷、北京卷等,共107页,章节目录及页码如下:一……中国首位女留学生美国人崇拜她总统挽留她,她却坚决回到祖国中国首位女留学生:美国人崇拜她、总统挽留她,她却坚决回到祖国她是美国历史上首个中国女留学生;她是被美国总统罗斯福接见并专门为其更改美国法律的中国女人。美国媒体毫不吝……难民引爆美国党争,上万儿童被监禁,中国在联合国关切美人权问题要考察一个国家的人权保障水平,就要看这个国家对待弱势群体的方式。作为世界头号强国,美国在这方面显然不能令人满意。无论是特朗普,还是拜登,美国总统在难民问题上不负责任的做法,凸显……暂停键加速键经济发展类过渡句50例1。贯彻新理念,注重从数量追赶转向质量追赶;培育新动能,注重从要素驱动转向创新驱动。2。在落实政策、共克时艰中稳住了大盘,在改革创新、优化环境中蓄积了动能。3。数据……执法男篮的世预赛裁判,让人恨得牙痒痒的男篮世预赛第四个窗口期比赛已经结束,主帅杜锋赛后曾说过:夏天我们遇到了很多的困难,但球员们都坚持了下来。杜锋指导所说的困难,包括裁判的问题。1。裁判的权威性不容挑衅……关于退休最近,从网络读了不少关于退休的话题,我也想说两句,当然,我还没有退休。我想,那些把退休生活写的如此落寞与戚戚的人,也许是忘了一个更重要的事实。那就是,退休代表身份的重大改……李若晖论儒学的制度之维与中国哲学之成立……女儿脑瘫,丈夫截瘫,绝望妻子摆出无人水果摊自选自称自愿付款2014年11月19日,一群城管正在湖南长沙县城西安置小区门口的街道上巡逻。刚踏上这个街道,城管们就察觉到了不对劲的地方走在路上的人们都在对着一个地方指指点点。城管们凭着……无题很想为生活或为所谓的青春纪念点什么,不知道要说点什么也不知从何说起,嘴角边上的那些只言片语,被风轻轻一吹就碎了散了。对白如此苍白,情节如些庸俗,该怎么表达表情才不难过。……Java19的结构化并发,一种新的多线程编程模式头条创作挑战赛结构化并发在Java19中是孵化功能,比预览功能的成熟度更低。想要尝鲜的朋友可以试试。想要在LTS版本中使用该功能,估计得等到Java25了。结构化并……
餐桌上的几种食物,是肝病催化剂,具体都是什么?清末著名民族英雄关天培印象图集冉雄飞再曝足协惊天丑闻!徐驰酒后威胁辱骂王永华,称为领导平事新旧在交替,15张50年代上色老照片,贫穷又落后但不怯全世界1925年9月,清华国学研究院开学了有人说,现在医学这么发达,腰间盘突出却治不好,这是为什么?要是楚乔传女主改成杨颖,你们觉得怎么样?由珠海去澳门玩,参团好还是自由行好?帮我参谋参谋好吗?那些退休老大爷老奶奶每天扛着单反相机拍照,拍的好看吗?在保定上大学有必要留在保定吗?不爱发生活动态的人都是什么心理?暮白首那岚岳和林若寒什么关系?那岚岳父母是谁?超囧的几对爆笑夫妻为什么翡翠戒指很贵翡翠戒指为什么价格高宝宝尿床很常见错误观念需绕开火灾逃生自救12大法黄瓜农药残留多吗燕子掌叶片发黄是咋回事养植燕子掌哪些事项是要注意的如何用手机拍出好照片?写书造句用写书造句大全2021年高校就业报告出炉,计算机行业最受欢迎,技术岗独得青入学造句用入学造句大全品读大师们的经典情书

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找