Java 7:满足Fork / Join框架

JSR-166(y)是Java 7中包含的此新功能的正式名称。如果您发现名称中有一个“ y”,这是因为自Java 5起就添加了JSR-166(并发实用程序) ,但它不会就此停止,因为已经有计划在JSR-166(e)下在Java 8中添加新类。 检查此页面,由JSR-166的创建者Doug Lea维护,以获取更多信息。

根据Wikipedia的说法, 并行性是“在多个处理器上同时执行已编程指令和数据的多个实例的某种组合”,并且Java从第1天起就有类和接口来实现此目的(有点……)。您可能将它们称为: java .lang.Thread , java.lang.Runnable等…并发实用程序( java.util.concurrent包)的作用是简化并发任务的编码方式,因此我们的代码更加简单和简洁。 作为开发人员,在具有更高处理资源的计算机上运行应用程序时,我们无需执行任何操作,显然,我们的应用程序性能会提高,但是我们是否真的在最大限度地利用处理资源? 答案是否定的。

这篇文章将向您展示在处理可分为小问题的问题时,Fork / Join框架将如何最大程度地帮助我们使用处理资源,并且解决这些小问题中的每一个的所有解决方案都将产生大问题的解决方案问题(例如递归,分而治之)。

你需要什么

NetBeans 7+或任何其他支持Java 7 JDK 7+的 IDE
图像模糊 ,来自Oracle的示例

基础

Fork / Join框架专注于使用计算机中可用的所有处理资源来提高应用程序的性能。 它旨在简化Divide and Conquer算法中的并行性。 Fork / Join框架背后的魔力在于其工作窃取算法,该算法中的工作线程可以从其他繁忙线程中自由窃取任务,因此所有线程始终都在工作。 以下是开始使用框架时应了解的基础知识:

  • Fork意味着将任务分为子任务并进行处理。
  • 联接意味着将每个子任务的解决方案合并为一个通用解决方案。
  • java.lang.Runtime使用此类来获取可用于Java虚拟机的处理器数量。 为此,请使用方法+ availableProcessors():int
  • java.util.concurrent.ForkJoinPool框架的主类,是实现工作窃取算法并负责运行任务的类。
  • java.util.concurrent.ForkJoinTask抽象类,用于在java.util.concurrent.ForkJoinPool中运行的任务。 将任务理解为整个工作的一部分,例如,如果您需要在数组上做某事,则一个任务可以在位置0n / 2上工作,而另一个任务可以在位置(n / 2)+1上工作n-1 ,其中n是数组的长度。
    • java.util.concurrent.RecursiveAction抽象任务类的子类,在不需要任务返回结果时使用它,例如,当任务在数组的位置上工作时,它不返回任何内容,因为它在阵列上工作。 为了完成这项工作,您应该实现的方法是compute():void ,请注意void返回值。
    • java.util.concurrent.RecursiveTask抽象任务类的子类,当任务返回结果时使用它。 例如,在计算斐波那契数时,每个任务必须返回它计算出的数以加入它们并获得一般解。 为了完成这项工作,您应该实现的方法是compute():V ,其中V是返回值的类型; 对于Fibonacci示例, V可以是java.lang.Integer。

使用框架时,应定义一个标志,该标志指示是否有必要派生/加入任务或是否应直接计算工作。 例如,在处理数组时,可以指定如果数组的长度大于500_000_000,则应分叉/加入任务,否则,数组足够小以直接计算。 本质上,接下来应显示的算法如下:

if(the job is small enough)
{compute directly
}
else
{split the work in two pieces (fork)invoke the pieces and join the results (join)
}

好了,现在理论太多了,我们来看一个例子。

这个例子

模糊图像需要对图像的每个像素进行处理。 如果图像足够大,我们将需要处理大量像素,因此我们可以使用fork / join对它们进行处理,并最大限度地利用处理资源。 您可以从Java™Tutorials站点下载源代码。

下载源代码后,打开NetBeans IDE 7.x并创建一个新项目:

然后从显示的弹出窗口的Java类别中选择“具有现有源代码的Java项目”

选择一个名称和一个项目文件夹,然后单击下一步>

现在, 在图像示例中选择下载了Blur源代码的文件夹:

并选择文件ForkBlur.java,然后单击完成:

将导入源代码,并创建一个新项目。 请注意,新项目显示为错误,这是因为默认情况下未启用Java 7:

要解决此问题,请右键单击项目名称,然后选择选项属性 。 在弹出对话框中,转到“ 库”,然后从“ Java平台组合框”中选择“ JDK 1.7 ”:

现在,转到选项Sources并从Source / Binary Format ComboBox中选择JDK 7

最后但并非最不重要的一点是,在运行此应用程序时增加分配给虚拟机的内存,因为我们将访问500万个位置数组(或更多)。 转到选项运行并在VM Options TextBox上插入-Xms1024m -Xmx1024m

单击确定 ,您的项目应该没有错误进行编译。 现在,我们需要找到足够大的图像,以便可以处理较大的阵列。 一段时间后,由于好奇心机器人的帮助,我发现了火星上的一些很棒的图像(约150 MB),您可以从此处下载图像 。 下载图像后,将其粘贴到项目的文件夹中。

在运行示例之前,我们需要修改源代码,以便控制何时使用Fork / Join框架运行它。 在ForkBlur.java文件中,转到第104行,以更改将要使用的图像的名称:

//Change for the name of the image you pasted 
//on the project's folder.
String filename = 'red-tulips.jpg';

然后,用下面的代码替换第130至136行:

ForkBlur fb = new ForkBlur(src, 0, src.length, dst);boolean computeDirectly = true;long startTime = System.currentTimeMillis();if (computeDirectly) {fb.computeDirectly();} else {ForkJoinPool pool = new ForkJoinPool();pool.invoke(fb);}long endTime = System.currentTimeMillis();

注意computeDirectly标志。 为true时 ,我们将使用fork / Join Framework,而是直接计算任务。 如果为false,将使用fork / join框架。

ForkBlur类中的compute():void方法实现了fork / join算法。 它基于数组的长度,当数组的长度大于10_000时,将分派任务,否则将直接计算任务。

在不使用Fork / Join框架( computeDirectly = true )的情况下, 在图像示例上执行Blur时,您可以看到我的2个处理器,大约花了14 秒钟完成工作:

您可以看到处理器正在工作,但没有达到最大。 当使用Fork / Join框架( computeDirectly = false )时,您可以看到它们以100%的速度工作,并且花了将近50%的时间来完成工作:

该视频显示了完整的过程:

希望您能看到这个框架有多有用。 当然,您不能在代码中全部使用它,但是只要您有一个可以分为多个小任务的任务,那么您就知道该呼叫谁。

参考: Java 7:在Java and ME博客上, 与 JCG合作伙伴 Alexis Lopez交流Fork / Join框架 。


翻译自: https://www.javacodegeeks.com/2012/10/java-7-meet-forkjoin-framework.html

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

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

相关文章

css3总结之居中

居中在前端布局上很常见,也很常用,也是最基本的技巧。居中效果在方向控制上基本可以分解成水平居中,垂直居中和水平垂直居中。 针对调整的元素不同,具体的处理方式上有些差异。这里我们先不讲绝对定位下的居中,绝对定位…

PHP进程及进程间通信

一、引言 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。换句话说就是,在系统调度多个cpu的时候,一个程序的基本单元。进程对于大多数的语言都不是一个陌生的概念,作为"世界上最好的语言PHP"当然也例外。 二、环境…

福州java培训哪里好_南通java培训哪家好

渡课IT教育成立于2006年,14年来,我们累计输送学员达 6000 ,其中南通地区输送50%,上海 40%,其他地区 10%,学员1年后的平均薪水达 9860 元;受到1000用人单位的赞誉与支持。Java开发的需求量在北上…

Linux 服务器注意事项

1.创建时 数据文件一定分盘挂载 2.LVM 虚拟磁盘卷是否创建 有争议???3.hosts 文件 最好添加本机映射 主机名 127.0.0.1 4.iptables 开启转载于:https://www.cnblogs.com/centos2017/p/7896681.html

linux 查看下挂磁盘,linux下磁盘挂载与查看

df查看系统分区和使用情况使用方法:df-h(自动按照大小做单位适应显示)df-i(查看iNode使用情况)free查看..LABELdefaults默认选项:rw (可读写)sudi (加此选项后则该分区可为文件加s权限;如不需要则写为nosuid)dev(可以解析该分区下的块…

研究僵局–第2部分

调查死锁时最重要的要求之一就是要研究死锁。 在我的上一个博客中,我编写了一个名为DeadlockDemo代码,该代码使用一堆线程在一系列银行帐户之间转移随机数,然后陷入僵局。 该博客运行该代码以演示获取线程转储的几种方法。 线程转储只是一个…

从0开始接触html--第一天学习内容总结

第一天 总结: h1-h6 p 段落 hr br有序 ol li 无序 ul li 定义列表 dl dt dd块级元素:独占一行,h1-h6 p hr div行内元素:共占一行, em和i strong和b u del和s span块级分区元素:div header nav article footer行内分区元素&#…

连锁便利店管理系统有什么用

连锁便利店管理系统对于连锁便利店的运营和管理非常有用。以下是一些常见的用途: 1. 库存管理:连锁便利店通常需要管理多个门店的库存,管理系统可以帮助实时掌握各个门店的库存情况,包括商品数量、进货记录、库存调拨等。这样可以…

经常使用meta标签属性

《meta》 1.Keywords (keyword)说明&#xff1a;告诉搜索引擎你网页的keyword是什么。 使用方法&#xff1a;<meta name"keywords" content"SEO优化,SEO优化教程,站点优化,搜索引擎优化教程"> 2. Description (网页描写叙述)说明&#xff1a;Descrip…

浏览器打印设置横向打印_爱普生打印机无线连接设置

1、首先&#xff0c;把epsonl385打印机插上电源通电&#xff0c;待自检完成后&#xff0c;便可以设置。如果用户家里的无线路由器带有WPS(Wi-Fi Protected Setup)或QSS(又称快速安全设置)功能&#xff0c;那就简单多了。2、通过WPS或QSS无线路由器按钮连接&#xff0c;给无线路…

linux python定时任务调度,Python下定时任务框架APScheduler的使用

1.APScheduler简介&#xff1a;APScheduler是Python的一个定时任务框架&#xff0c;可以很方便的满足用户定时执行或者周期执行任务的需求&#xff0c;它提供了基于日期date、固定时间间隔interval 、以及类似于Linux上的定时任务crontab类型的定时任务。并且该框架不仅可以添加…

图片和文件上传js剖析

/** * 商户资质信息模块js * * 涉及页面组件 { * 上传组件&#xff08;UploadFileComponent&#xff09; * } * * * 初始化工具&#xff08;init&#xff09; * * Author:Waver */var qualificationInfoModule (function() { // 上传文件类型 var UPLOAD_FILE_TYPE…

研究僵局–第1部分

我敢肯定我们都去过那里&#xff1a;太晚了&#xff0c;您饿了&#xff0c;服务器已挂起&#xff0c;或者应用程序正在以蜗牛的速度运行&#xff0c;并且有人喘着气想要您解决问题&#xff0c;然后再去解决。 您的应用程序意外挂起的可能原因之一是称为死锁的线程问题。 无需赘…

前端的学习之旅

Html学习笔记1 特殊符号&#xff1a;html中对换行缩进空格不敏感&#xff0c;都只会解析成一个空格 空格&#xff1a; < : < > :$gt; 版权符号&#xff1a;&copy&#xff1b; 表格&#xff1a;1 表示表格&#xff1a;table表示表格 tr&#xff1a;…

使用Vue.js和Axios从第三方API获取数据 — SitePoint

更多的往往不是&#xff0c;建立你的JavaScript应用程序时&#xff0c;你会想把数据从远程源或消耗一个[ API ]&#xff08;https&#xff1a;/ /恩。维基百科。org /维基/ application_programming_interface&#xff09;。我最近看了一些[公开]&#xff08;https://github.co…

区位码怎么知道点阵里的起始点_自身免疫疾病的GAPS起始饮食改良版

写这篇文章的原因如果您已经关注我的博客一段时间&#xff0c;您知道我开始使用GAPS饮食&#xff0c;然后转换到AIP饮食&#xff0c;因为我仍在努力治疗炎症和自身免疫的发作。 Katy Haldiman 有同样的经历&#xff0c;我们并不孤单。许多患有自身免疫性疾病的人在 GAPS 上挣扎…

Linux存储保护,谈谈Linux中的存储保护

谈谈Linux中的存储保护以下讨论的内容是以i386平台为基础的Linux将4G的地址划分为用户空间和内核空间两部分。在Linux内核的低版本中(2。0。X)&#xff0c;通常0-3G为用户空间&#xff0c;3G-4G为内核空间。这个分界点是可以可以改动的。正是这个分界点的存在&#xff0c;限制了…

004-JQuery属性

添加与删除属性CSS类HTML代码/文本/值添加与删除属性 attr(name|properties|key,value|fn) &#xff1a;设置或返回被选元素的属性值 removeAttr(name) &#xff1a;从每一个匹配的元素中删除name属性 prop(name|properties|key,value|fn) &#xff1a;获取在匹配的元素集中的第…

预热您的JVM –超快速生产服务器和IDE

几个月前&#xff0c;我正在阅读Java中的复杂事件处理以及实现低延迟的方法。 在我长达一个小时的研究结束时&#xff0c;我发现即使您的应用程序编写正确并且您的方法主要在0&#xff08;log n&#xff09;的时间内运行&#xff0c;并且您正在使用某些前沿的硬件解决方案&…

微信小程序APP(商超营销类)经验总结

项目介绍 这是一款主打门店营销的小程序。包括首页、门店、营销、个人设置、登录、数据统计展示、营销设置等。 本来要独立完成整个项目&#xff0c;包括前后端一套的&#xff0c;有些意外因素&#xff0c;项目临时收尾&#xff08;说明&#xff1a;只完成了前端的部分&#…