java stream 求和_谈谈Java任务的并行处理

作者:ksfzhaohui

前言

谈到并行,我们可能最先想到的是线程,多个线程一起运行,来提高我们系统的整体处理速度;为什么使用多个线程就能提高处理速度,因为现在计算机普遍都是多核处理器,我们需要充分利用cpu资源;如果站的更高一点来看,我们每台机器都可以是一个处理节点,多台机器并行处理;并行的处理方式可以说无处不在,本文主要来谈谈Java在并行处理方面的努力。

无处不在的并行

Java的垃圾回收器,我们可以看到每一代版本的更新,伴随着GC更短的延迟,从serial到cms再到现在的G1,一直在摘掉Java慢的帽子;

消息队列从早期的ActiveMQ到现在的kafka和RocketMQ,引入的分区的概念,提高了消息的并行性;数据库单表数据到一定量级之后,访问速度会很慢,我们会对表进行分表处理,引入数据库中间件;

Redis你可能觉得本身处理是单线程的,但是Redis的集群方案中引入了slot(槽)的概念;更普遍的就是我们很多的业务系统,通常会部署多台,通过负载均衡器来进行分发;好了还有其他的一些例子,此处不在一一例举。

如何并行

我觉得并行的核心在于"拆分",把大任务变成小任务,然后利用多核CPU也好,还是多节点也好,同时并行的处理,Java历代版本的更新,都在为我们开发者提供更方便的并行处理,从开始的Thread,到线程池,再到fork/join框架,最后到流处理,下面使用简单的求和例子来看看各种方式是如何并行处理的;

单线程处理

首先看一下最简单的单线程处理方式,直接使用主线程进行求和操作;

bbdb915114feef76eee694df7208a755.png

求和本身是一个计算密集型任务,但是现在已经是多核时代,只用单线程,相当于只使用了其中一个cpu,其他cpu被闲置,资源的浪费;

Thread方式

我们把任务拆分成多个小任务,然后每个小任务分别启动一个线程,如下所示:

a96728a6d3f8533051412b0cb3d1644b.png

以上指定了一个拆分阀值,计算拆分多少个任务,同时启动多少线程;这种处理就是启动的线程数过多,而CPU数有限,更重要的是求和是一个计算密集型任务,启动过多的线程只会带来更多的线程上下文切换;同时线程处理完一个任务就终止了,也是对资源的浪费;另外可以看到主线程不知道何时子任务已经处理完了,需要做额外的处理;所有Java后续引入了线程池。

线程池方式

jdk1.5引入了并发包,其中包括了ThreadPoolExecutor,相关代码如下:

99ea669a46b3b8e0e210305a0a2f005b.png

上面已经分析了计算密集型并不是线程越多越好,这里创建了JDK默认的线程数:CPU数+1,这是一个经过大量测试以后给出的一个结果;线程池顾名思义,可以重复利用现有的线程;同时利用CompletionService来对子任务进行汇总;合理的使用线程池已经可以充分的并行处理任务,只是在写法上有点繁琐,此时JDK1.7中引入了fork/join框架;

fork/join框架

分支/合并框架的目的是以递归的方式将可以并行的认为拆分成更小的任务,然后将每个子任务的结果合并起来生成整体结果;相关代码如下:

155c386a0eef004258ed3293741cfe42.png

ForkJoinPool是ExecutorService接口的一个实现,子任务分配给线程池中的工作线程;同时需要把任务提交到此线程池中,需要创建RecursiveTask的一个子类;大体逻辑就是通过fork进行拆分,然后通过join进行结果的合并,JDK为我们提供了一个框架,我们只需要在里面填充即可,更加方便;有没有更简单的方式,连拆分都省了,自动拆分合并,jdk在1.8中引入了流的概念;

流方式

Java8引入了stream的概念,可以让我们更好的利用并行,使用流代码如下:

e6fdf890702b49be7687de12e1e12e8a.png

以上代码是不是非常简单,对于开发者来说完全不需要手动拆分,使用同步机制等方式,就可以让任务并行处理,只需要对流使用parallel()方法,系统自动会对任务进行拆分,当然前提是没有共享可变状态;其实并行流内部使用的也是fork/join框架;

总结

本文使用一个求和的实例,来介绍了jdk为开发者提供并行处理的各种方式,可以看到Java一直在为提供更方便的并行处理而努力。

参考

《java8实战》

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

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

相关文章

华为交换机不同网段互访_华为S5700系列交换机使用高级ACL限制不同网段的用户互访...

组网图形图1使用高级ACL限制不同网段的用户互访示例组网需求如图一所示,某公司通过Switch实现各部门之间的互连。为方便管理网络,管理员为公司的研发部和市场部规划了两个网段的IP地址。同时为了隔离广播域,又将两个部门划分在不同VLAN之中。…

现在的男生真的太惨了

1 做男生不容易啊2 这到底是被甲方怎样虐过3 暴风螺旋般的伤口撒盐式连环补刀来源:知乎4 说好的雪橇三傻呢?5 谁都别打扰我看电视6 正弦余弦的空间展示7 这是什么原理?你点的每个赞,我都认真当成了喜欢

EF 更新大量的数据时出现重复键错误

咨询区 ChsharpNewbie:当我把大量的数据插入到数据库时 (PostgreSQL 12 和 Entity Framework Core),我得到了如下的报错。fail: Microsoft.EntityFrameworkCore.Database.Command[20102]Failed executing DbCommand (197ms) [Parameters[p0?, p1?, p2?…

SharePoint 2010 - 如何导入\导出WebPart

为了保存WebPart并进行重用,有时我们必须导出该WebPart并在其他页面中将其导入。下面是对此过程的描述。 导出一个WebPart 导出一个WebPart可以将WebPart设置保存成计算机本地文件。并不是所有的WebPart都支持这个选项,该页面的所有者可能禁用了这个选项…

OC----内存管理

任何继承了NSObject的对象,都需要内存管理,但是对基本数据类型无效(不需要释放)原理:每个对象内部都保存了一个与之相关联的整数,称为引用计数器当使用alloc、new或者copy创建一个对象时,对象的…

python赋值语句格式_Python赋值语句后逗号的作用分析

Python赋值语句后逗号的作用分析 本文实例讲述了Python赋值语句后逗号的作用。分享给大家供大家参考。具体分析如下: IDLE 2.6.2 >>> a 1 >>> b 2, >>> print type(a)>>> print type(b)>>> c [] >>> d […

.NET 6 中的 Http Logging 中间件

.NET 6 中的 Http Logging 中间件Intro.NET 6 会引入一个 Http logging 的中间件,可以用来帮助我们比较方便记录请求和响应的信息Sample废话不多说,直接来看示例吧var builder WebApplication.CreateBuilder(args);builder.Services.AddControllers(); …

vue限制点击次数_解决vue 按钮多次点击重复提交数据问题

这个其实是一个很细节的问题。 如果我们操作一个按钮,然后在按钮点击的时候绑定事件。事件分为两种情况:•第一种: 不操作数据型•第二种: 操作数据型 点击 这里我们通过控制isDisable 来设置 disabled来控制按钮的点击和不可点击…

Android 开发学习资源

http://www.verycd.com/topics/2892330/http://www.verycd.com/topics/2900036/转载于:https://www.cnblogs.com/chen110xi/archive/2011/12/06/2277493.html

函数的作用域在各浏览器的混乱情况

if(true) {function someFunc(){return 1;};} else {function someFunc(){return 2;};}var notSomeFunc function someFunc(){return 3;};alert(someFunc());FF输出1,表现为存在“块作用域”。 IE6-IE8输出3,这是它处理命名函数表达式时出现bug&#xf…

2020年高考数学试题难吗?历史上最难数学卷不是2003!

全世界只有3.14 % 的人关注了爆炸吧知识不经历风雨怎能知道明天会死得更惨今天,高考拉开大帷幕,数学考试结束的一瞬间,在微博上简直是一片哀嚎今年,延期一个月高考让许多人预测,难度比起非典那一年或许将有增无减&…

深入浅出Docker(三):Docker开源之路

背景 Docker从一开始的概念阶段就致力于使用开源驱动的方式来发展,它的成功缘于国外成熟的开源文化氛围,以及可借鉴的社区运营经验。通过本文详细的介绍,让大家可以全面了解一个项目亦或者一项技术是如何通过开源的方式发展起来的。为了更准确…

android activity解耦,Android与设计模式:用单一职责原则为Activity解耦

一、什么是单一职责原则单一职责原则(SRP:Single responsibility principle)又称单一功能原则,其定义为:一个类,应该只有一个可以导致变化的原因。光看概念一、什么是单一职责原则单一职责原则(SRP:Single responsibil…

python画图程序没有图_python画图 - v0

学了这么多年python了,还一直没有系统地了解过python的画图功能。 每次都是现学现用,但是某些比较紧急的场合,往往就会比较耗时又耗力,因为不成体系,还经常会忘记已经吸纳的新知识。 所以,我决定把这块的画…

利用Azure communication service实现跟Teams同样等级的沟通协作应用

大家都知道Teams是一个非常强大的沟通协作平台,包括聊天,团队协作,会议,以及应用集成等功能,现在在全世界拥有数以亿计的商业用户。作为Teams平台的一个延伸,产品组把一些核心功能变成了一个公开的服务&…

一个入门的学生选课系统

大三的时候写的一个学生选课系统,WinForm 的使用的SQL数据库。主要有学生,老师两类用户,老师查看选择自己课程的学生,学生进行选课(只能选5门课),登陆的时候要有登陆错误次数限制超过会锁定&…

python功能选择模块_python – 组合功能和功能模块

您的compose的实现对于python 3.2是有效的,如上述注释所述.你给出的图书馆的大部分功能都是在documentation中写的python等价物.诸如地图和过滤器的功能已经在python中实现,也可以简单地表示为列表推导. Python有一个id函数返回一个对象的身份(作为整数),但是该库的id函数可以表…

1574: [Usaco2009 Jan]地震损坏Damage

1574: [Usaco2009 Jan]地震损坏Damage Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 425 Solved: 232[Submit][Status][Discuss]Description 农夫John的农场遭受了一场地震.有一些牛棚遭到了损坏,但幸运地,所有牛棚间的路经都还能使用. FJ的农场有P(1 < P < 30,000)…

世界上最诡异的画,到底为何让无数人闻风丧胆?

全世界只有3.14 % 的人关注了爆炸吧知识也许只看到标题 &#xff0c;你一定想不到&#xff0c;传说中世界上最诡异的画是这张。《雨中女郎》这是乌克兰画家斯韦特兰娜捷列茨&#xff0c;绘画生涯中重要的一个作品。也许你会说哪里诡异呢&#xff1f;其实很多人看完这幅画以后&a…

谷歌街景新功能——帮警方抓毒贩

“地球上的毒贩子们&#xff0c;谷歌正在看你们呢。”11月11日的《纽约邮报》在题为《谷歌街景帮忙逮住嫌疑毒贩》的报道开篇这样写道。报道援引执法人员的话说&#xff0c;当时三个毒贩在纽约布鲁克林一处街角向人兜售他们的产品时&#xff0c;被谷歌街景拍个正着。 纽约警介绍…