线程池之外:Java并发并不像您想象的那么糟糕

并发

Apache Hadoop,Apache Spark,Akka,Java 8流和Quasar: 针对Java开发人员的经典用例以及最新的并发方法

关于并发性更新概念的讨论很多,但是许多开发人员还没有机会将他们的想法缠住。 在本文中,我们将详细介绍您需要了解的有关Java 8流,Hadoop,Apache Spark,Quasar光纤和Reactive编程方法的知识,并帮助您保持循环,尤其是当您不使用它们时。定期地 这不是未来,这正在发生。

我们在这里处理什么?

在谈论并发时,表征当前问题的一种好方法是回答一些问题,以更好地理解它:

  1. 它是数据处理任务吗? 如果是这样,是否可以将其分解为独立的工作?
  2. 操作系统,JVM和您的代码之间有什么关系? (本地线程与轻量级线程)
  3. 涉及多少台机器和处理器? (单核与多核)

让我们仔细研究每种方法,找出每种方法的最佳用例。

1.从线程池到并行流

单台机器上的数据处理,让Java负责线程处理

在Java 8中,我们已经引入了新的Stream API,该API允许对数据流应用聚合操作,例如Filter,Sort或Map。 在应用.parallelStream()时,流还允许在多核计算机上进行并行操作–使用Java 7中引入的Fork / Join框架在线程之间拆分工作。这是Java 6 java.util.concurrency库的改进,我们在其中遇到了ExecutorService,用于创建和处理我们的工作线程池。

Fork / Join也建立在ExecuterService之上,与传统线程池的主要区别在于它们如何在线程之间分配工作,从而实现多核机器支持。 使用简单的ExecuterService,您可以完全控制工作线程之间的工作负载分配,确定线程要处理的每个任务的大小。 另一方面,在使用Fork / Join的情况下,有一种工作窃取算法可以抽象化线程之间的工作负载处理。 简而言之,这允许将大型任务划分为较小的任务(分叉),并在不同的线程中进行处理,最终合并结果–平衡线程之间的工作。 但是,这不是灵丹妙药。

有时并行流甚至可能使您放慢速度,因此您需要仔细考虑。 添加.parallelStream()到你的方法可能会导致瓶颈和怠工(约15%的速度较慢这一基准,我们跑),精线经过的线程数。 假设我们已经在运行多个线程,并且在其中一些线程中使用了.parallelStream(),从而向池中添加了越来越多的线程。 这很容易变成我们的核心无法处理的事情,并且由于增加了上下文切换而减慢了一切。

底线:并行流以在内核之间分配工作负载的方式抽象处理单台计算机上的线程。 但是,如果您想有效地使用它们,那么请务必牢记硬件,不要产生超出计算机处理能力的更多线程。

2. Apache Hadoop和Apache Spark

重型起重:多台机器上的大数据处理

移至多台机器,数PB的数据和类似于从推特或重型机器学习算法中提取所有提及Java的推文的任务。 说到Hadoop,重要的是要采取进一步的措施并考虑更广泛的框架及其组件:Hadoop分布式文件系统(HDFS),资源管理平台(YARN),数据处理模块(MapReduce)以及其他库和实用程序Hadoop(通用)所需。 在这些工具之上还有其他可选工具,例如在HDFS(HBase)之上运行的数据库,查询语言(Pig)的平台以及数据仓库基础结构(Hive)等。

这是Apache Spark作为新数据处理模块的介入之地,以其内存性能和快速执行的弹性分布式数据集(RDD)的使用而闻名,这与不使用内存(和内存)的Hadoop MapReduce不同。磁盘)操作。 Databricks发布的最新基准测试表明,在对PB级数据进行排序时,Spark比Hadoop 快3倍 ,而节点使用量却减少了10倍

Hadoop大象

Hadoop的经典用例是查询数据,而Spark以其快速的机器学习算法运行时间而闻名。 但这只是冰山一角,正如Databricks所说: “ Spark使Hadoop集群中的应用程序在内存中的运行速度提高了100倍,甚至在磁盘上运行时也提高了10倍”

底线: Spark是Hadoop生态系统中的新后起之秀。 有一个普遍的误解,就是我们谈论的是无关或竞争的事物,但是我相信我们在这里看到的是框架的演变。

3.类星体纤维

将本地线程中断为虚拟轻量级线程

我们有机会在Hadoop中运行,现在让我们回到单机上。 实际上,让我们比标准多线程Java应用程序进一步放大,并专注于一个单线程。 就我们而言,HotSpot JVM线程与本机OS线程相同,仅保留一个线程并在其中运行“虚拟”线程就可以了。 Java没有本机光纤支持,但不用担心, Parallel Universe的Quasar吸引了我们。

Quasar是一个开放源代码的JVM库,它支持光纤(也称为轻量级线程),并且还充当Actor框架,我将在后面提到。 上下文切换是这里的游戏名称。 由于我们受到内核数量的限制,因此当本机线程数增加时,我们将面临越来越多的上下文切换开销。 解决这一问题的一种方法是使用支持“多线程”的单线程的光纤。 看起来像是threadcepiton的情况。

光纤也可以看作是线程池的演进,它规避了并行流所带来的线程过载的危险。 它们使扩展线程变得更容易,并允许大量并发的“轻”线程。 它们无意替换线程,而应用于相对频繁阻塞的代码,就像它们充当了真正的异步线程一样。

底线: Parallel Universe正在Java中提供一种新的并发方法,尚未达到v1.0,但绝对值得一试。

4.演员和反应式编程

使用Java处理并发的其他模型

在“ 反应式宣言”中 ,以4条原则描述了新机芯:响应,弹性,弹性和消息驱动。 这基本上意味着快速,容错,可扩展且支持无阻塞通信。

让我们看看Akka演员如何支持这一点。 为简化起见,将Actor视为具有某种状态和某种行为的人,通过交换发送到彼此邮箱的消息进行交流。 应该为每个应用程序创建一个Actor系统,该系统具有将任务分解为较小任务的层次结构,以便每个Actor最多只有一个监督Actor。 演员可以执行任务,通过委托其他演员进一步分解事件,或者在失败的情况下,将其上报给主管。 无论哪种方式,消息都不应包含行为或共享可变状态,每个Actor都具有独立的声明和自身的行为。

与大多数开发人员习惯的并发模型相比,这是一种范式转变。 这与我们在这里讨论的前3个主题的发展有些偏离。 尽管它的起源可以追溯到70年代,但直到最近几年它才受到关注,并得到了复兴,以更好地适应现代应用程序的需求。 Parallel Universe的Quasar还基于轻量级线程支持Actor。 实施方面的主要区别在于纤维/轻质纱线。

底线:采用Actor模型可以轻松管理线程池,将其留给工具箱。 兴趣的复兴来自当今应用程序要处理的问题,即高度并发的系统,我们可以使用更多的内核。

结论

我们已经通过4种方法使用并发或并行算法来解决问题,并且采用了最有趣的方法来应对当今的挑战。 希望这有助于激起您的兴趣,并更好地了解当今并发的热门话题。 超越线程池的趋势是,负责任地将其委派给该语言及其工具–将开发资源集中在提供新功能上,而不是花费大量时间解决竞争条件和锁定问题。

翻译自: https://www.javacodegeeks.com/2014/11/beyond-thread-pools-java-concurrency-is-not-as-bad-as-you-think.html

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

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

相关文章

vue中使用Ueditor编辑器 -- 1

一、 下载包: 从Ueditor的官网下载1.4.3.3jsp版本的Ueditor编辑器,官网地址为:http://ueditor.baidu.com/website/download.html 下载解压后会得到如果下文件目录: 将上述Ueditor文件夹拷贝到vue项目的static文件夹中&#xff0…

编译原理--递归下降分析实验C++

一、实验项目要求 1.实验目的 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。 2.实验要求 对下列文法,用递归下降分析法对任意输入的符号串进行分析: &#…

vue中通过js控制页面样式方法

在使用vue.js框架的时候,有时候会希望在页面渲染完成之后,再执行函数方法来处理初始化相关的操作,如果只处理页面位置、宽或者高时,必须要在页面完全渲染之后才可以,页面没有加载完成之前,获取到的宽高不准…

快速指南:剖析JBoss BPM跨进程通信

(文章来宾与北美红帽公司高级解决方案架构师杰伊保拉杰共同撰写) 几周的提示与技巧文章将深入探讨JBoss BPM Suite,特别是有关如何在两个流程之间进行通信的问题。 在进入解决方案详细信息之前,让我们首先约束将要讨论的用例。 …

使用命令行工具创建WildFly OpenShift应用程序

通过使用快速入门,可以在OpenShift上轻松配置WildFly的新实例。 只需单击一下,您就可以准备就绪! 通常,OpenShift的高级用户使用命令行工具 。 但是,您无法使用CLI工具创建WildFly墨盒。 但现在已解决错误1134134 。 …

word-break属性和css换行显示

这几天在做项目的时候,遇到了比较棘手的问题,便是在一个标签里边展示内容,如果说展示中文汉字,一点问题都没有,但是只要连续展示英文字母或者中文的标点符号(中间不带空格),那么所渲…

第四种行转列

--动态处理 select A.StuName,A.BZKTypeName,cast(A.BKCODE as varbinary(MAX)) even, row_number() over (partition by StuName,BZKTypeName order by getdate()) ID into #t1 from BKLIST A --where StuName林健辉 declare sql1 varchar(max) declare sql2…

React-router的基本使用

1、安装使用 $ npm install -S react-router import { Router, Route, hashHistory } from react-router;render((<Router history{hashHistory}><Route path"/" component{App}/></Router> ), document.getElementById(app)); 1.1、版本问题 reac…

九宫格有规律高亮滚动效果

前几天朋友去面试&#xff0c;面试官要求当场用九宫格写出一个滚动有规律的大转盘滚动高亮效果&#xff0c;结果可想而知。如下图&#xff1a; 也就是说当页面刚进来的时候&#xff0c;红色方块在左上角&#xff0c;接下来按照图上所标注的箭头方向来依次循环。当我听说了这个面…

使用Maven原型高效创建Eclipse模块

Maven Archetype是一个项目模板工具包&#xff0c;可为开发人员提供生成内置或自定义脚手架工件的参数化版本的方法。 最近&#xff0c;我将其应用于我们的Xiliary P2存储库&#xff0c;以实现Eclipse模块存根创建的自动化。 由于效果很好&#xff0c;所以我认为值得在这篇文章…

framelayout

编写的mail.xml文件: <?xml version"1.0" encoding"utf-8"?><FrameLayout xmlns:android"http://schemas.android.com/apk/res/android" android:id"id/frame" android:layout_width"fill_parent" android:layou…

扩展Asterisk1.8.7的CLI接口

我之前有一篇文章&#xff08;http://www.cnblogs.com/MikeZhang/archive/2012/04/14/asteriskCLIAppTest20120414.html&#xff09;介绍过如何扩展asterisk的cli接口&#xff0c;本篇是它的继续&#xff0c;总结下&#xff0c;也方便我以后查阅。 大部分情况下&#xff0c;配置…

CSS中的 ',' 、''、'+'、'~'

1、群组选择器&#xff08;,&#xff09; /* 表示既h1&#xff0c;又h2 */ h1, h2 {color: red; } 2、后代选择器&#xff08;空格&#xff09; /* 表示 h1 下面的所有 span 元素&#xff0c;不管是否以 h1 为直接父元素 */ h1 span {} 3、子元素选择器&#xff08;>&#x…

单片机第三季-第七课:STM32中断体系

目录 1&#xff0c;NVIC 2&#xff0c;中断和事件的区别 3&#xff0c;优先级的概念 4&#xff0c;如何实际编程使用外部中断 5&#xff0c;STM32开发板通过按键控制LED 5.1&#xff0c;打开相应GPIO模块时钟 5.2&#xff0c;NVIC设置 5.3&#xff0c;外部中断线和配套…

【学亮IT手记】angularJS select2多选下拉框实例

永远保持对大部分知识的好奇心&#xff0c;学习从不枯燥&#xff0c;也没有被逼学习一说&#xff0c;乐此不疲才是该有的心态和境界&#xff01;&#xff01;&#xff01; 引入相关js库&#xff1a; html部分代码&#xff1a; angularJS定义数据源变量&#xff1a; 更多专业前端…

Devoxx Hackergarten的企业Web应用程序原型

我已经连续10年参加DevoxxBe了 。 这是我最喜欢的Java会议&#xff0c;但是谈话时间表并不总是最佳的&#xff1a;有时我想同时看2个精彩的谈话&#xff01; 因此&#xff0c;在Devoxx的Hackergarten&#xff0c;在参加讲座之间&#xff0c;我们中的一些人开始构建Web应用程序以…

谈一谈Http Request 与 Http Response

谈一谈Http Request 与 Http Response   写在前面的话&#xff1a;最近帮朋友弄弄微信商城&#xff0c;对于微信的基础开发&#xff0c;基本上就是各种post、get&#xff0c;有时是微信服务器向我们的服务器post、get数据&#xff0c;有时需要我们自己的服务器向微信服务器各…

增压的jstack:如何以100mph的速度调试服务器

使用jstack调试实时Java生产服务器的指南 jstack就像U2一样-从时间的黎明就一直在我们身边&#xff0c;我们似乎无法摆脱它 。 除了笑话&#xff0c;到目前为止&#xff0c;jstack是您调试军用生产服务器中最方便的工具之一。 即便如此&#xff0c;我仍然认为它在情况恶化时能够…

Zabbix监控多个JVM进程

一、场景说明&#xff1a; 我们这边的环境用的是微服务&#xff0c;每个程序都是有单独的进程及单独的端口号&#xff0c;但用jps查询出来的结果有些还会有重名的情况&#xff0c;所以某些脚本不太适用本场景&#xff1b; 二、需求说明&#xff1a; 需使用Zabbix-server监控每个…

Android 4.0 Launcher源码分析系列(二)

原文&#xff1a;http://mobile.51cto.com/hot-314700.htm 上一节我们研究了Launcher的整体结构&#xff0c;这一节我们看看整个Laucher的入口点&#xff0c;同时Laucher在加载了它的布局文件Laucher.xml时都干了些什么。 我们在源代码中可以找到LauncherApplication&#xff0…