创建公司网站 教程,中国建筑协会官网,国家企业信用信息网官网,深圳网站公司推广平台Apache Hadoop#xff0c;Apache Spark#xff0c;Akka#xff0c;Java 8流和Quasar#xff1a; 针对Java开发人员的经典用例以及最新的并发方法 关于并发性更新概念的讨论很多#xff0c;但是许多开发人员还没有机会将他们的想法缠住。 在本文中#xff0c;我们将详细介… Apache HadoopApache SparkAkkaJava 8流和Quasar 针对Java开发人员的经典用例以及最新的并发方法 关于并发性更新概念的讨论很多但是许多开发人员还没有机会将他们的想法缠住。 在本文中我们将详细介绍您需要了解的有关Java 8流HadoopApache SparkQuasar光纤和Reactive编程方法的知识并帮助您保持循环尤其是当您不使用它们时。定期地 这不是未来这正在发生。 我们在这里处理什么 在谈论并发时表征当前问题的一种好方法是回答一些问题以更好地理解它 它是数据处理任务吗 如果是这样是否可以将其分解为独立的工作 操作系统JVM和您的代码之间有什么关系 本地线程与轻量级线程 涉及多少台机器和处理器 单核与多核 让我们仔细研究每种方法找出每种方法的最佳用例。 1.从线程池到并行流 单台机器上的数据处理让Java负责线程处理 在Java 8中我们已经引入了新的Stream API该API允许对数据流应用聚合操作例如FilterSort或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通用所需。 在这些工具之上还有其他可选工具例如在HDFSHBase之上运行的数据库查询语言Pig的平台以及数据仓库基础结构Hive等。 这是Apache Spark作为新数据处理模块的介入之地以其内存性能和快速执行的弹性分布式数据集RDD的使用而闻名这与不使用内存和内存的Hadoop MapReduce不同。磁盘操作。 Databricks发布的最新基准测试表明在对PB级数据进行排序时Spark比Hadoop 快3倍 而节点使用量却减少了10倍 。 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